【问题标题】:Determine if array is completely sorted确定数组是否完全排序
【发布时间】:2017-04-11 08:59:48
【问题描述】:

我目前正在用 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;
}

【问题讨论】:

标签: c arrays algorithm sorting


【解决方案1】:

您可以使用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;

【讨论】:

    【解决方案2】:

    你写的:

    do [...] while (1)
    

    这意味着 while 循环永远不会结束,1 将被评估为 true,除非循环中有中断或 goto(感谢 Flikk)。

    【讨论】:

    • 除非循环中有中断或跳转
    • @Flikk 但没有。
    • 我知道这种情况,但这是一个临时解决方案。
    【解决方案3】:

    为什么您认为冒泡排序需要永远持续下去?

    在您的内部 for 循环的一次迭代结束时,最大的元素将“冒泡”(因此得名)到数组的末尾。所以你会知道它在正确的地方。

    这意味着在下一次迭代中,您只需对第一个 length - 2 元素进行冒泡排序。在第三次迭代中,您只需要对第一个 length - 3 元素进行排序,依此类推,直到某个时候您发现自己对第一个 length - length 元素进行了排序。到那时,你就知道该停下来了。

    所以,您的 do ... while 循环可以是一个 for 循环。

    for (int sortLength = 1 ; sortLength < length ; ++ sortLength) // replaces your do while loop
    {
        for (int i = 0 ; i < length - sortLength ; ++i)
        {
            // Element swap stuff same as before
        }
    
        // print loop same as before
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 2010-09-21
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      相关资源
      最近更新 更多