c - 判断数组是否完全排序

标签 c arrays algorithm sorting

我目前正在用 C 语言创建这个程序,其目的是使用冒泡排序算法对包含多个元素的静态数组进行排序。冒泡排序可能不是一种快速有效的算法,但我将它用于教育目的。

这个程序几乎按我想要的方式工作,它正在排序,但我遇到了以下问题:

  • 即使数组本身已完全排序,我的 do-while 循环也会不断重复。现在它永远循环,我希望它在整个数组正确排序时停止。

如何判断整个数组是否排好序,排好后停止迭代?

这是我的代码:

#include <stdio.h> 

int main()
{
    int list[] = {5,1,5,4,3,2,1};
    int length = sizeof(list) / sizeof(int);

    printf("Unsorted array\n");
    printf("-----------------------------\n\n");

    for (int i = 0; i < length; i++)
    {
        if (i < length - 1)
            printf("%d, ", list[i]);
        else
            printf("%d", list[i]);
    }

    do
    {
        for (int i = 0; i < length - 1; i++)
        {

            if (list[i] > list[i + 1])
            {
                printf("\n* Moving %d and %d", list[i], list[i + 1]);
                int temp = list[i + 1];
                list[i + 1] = list[i];
                list[i] = temp;
            }

            else
            {
                getchar();
            }

            getchar();
        }
        printf("-----------------------------\n");

        for (int i = 0; i < length; i++)
        {
            if (i < length - 1)
                printf("%d, ", list[i]);
            else
                printf("%d", list[i]);
        }

    } while (1);

    printf("Goodbye!\n");
    getchar();
    return 0;
}

最佳答案

您可以使用flag 变量来检查在之前的迭代中是否有一些交换。如果没有,则数组已经排序并退出循环。

int flag = 0;
for (int i = 0; i < length - 1; i++)
{

    if (list[i] > list[i + 1])
    {
        printf("\n* Moving %d and %d", list[i], list[i + 1]);
        int temp = list[i + 1];
        list[i + 1] = list[i];
        list[i] = temp;
        flag = 1;
    }
    else
    {
        getchar();
    }

     getchar();
}

if (!flag) break;

关于c - 判断数组是否完全排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43341242/

相关文章:

c - 我想过滤数字流以获取某个范围内的值

c - open() 返回 "No such device"错误,但是有这样的设备 (linux)

javascript - 如何从 String.prototype.replace() 方法中的回调返回正确的值?

.NET 排序列表 <> 与关联数组

python - 我应该如何对这些元素进行分组,以使总体差异最小化?

优化特定指令集的合取范式表达式的算法?

c++ - 哪个运算符更快 : ! = 或 >

c - 左移运算符是否取决于寄存器大小?

javascript - 对象数组,在 JavaScript 中具有单独的属性

algorithm - 在有界区域内随机生成坐标