我目前正在用C语言创建这个程序,其目的是使用冒泡排序算法对包含多个元素的静态数组进行排序。冒泡排序可能不是一种快速有效的算法,但我将其用于教育目的。
这个程序几乎按我想要的方式工作,它正在排序,但我遇到了以下问题:
如何确定整个数组是否已排序,然后在完全排序时停止迭代?
这是我的代码:
#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;
}
答案 0 :(得分:2)
您可以使用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;
答案 1 :(得分:1)
你的写:
do [...] while (1)
这意味着while循环永远不会结束,1
将被评估为true
,除非循环中有中断或goto(感谢Flikk)。
答案 2 :(得分:0)
为什么你认为你的冒泡排序需要永远持续下去?
在内部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
}