我正在尝试在C中实现冒泡排序算法。这是我到目前为止所做的:
#include<stdio.h>
void bubble_sort(int m, int a[100000]);
void main()
{
int a[100000], i, m;
FILE * be;
be=fopen("be.txt","r");
for (i=0; !(feof(be)); ++i)
fscanf(be,"%i", a+i);
m=i-1;
bubble_sort(m ,a);
fclose(be);
}
void bubble_sort(int m, int a[100000])
{
int i, ok, v, n=m;;
for (;!ok;ok=1)
{
ok=0;
for (i=0;i<=m-1;++i)
{
if (*(a+i)>*(a+i+1)) { v=*(a+i); *(a+i)=*(a+i+1); *(a+i+1)=v; ok=0;}
}
m=m-1;
}
for (i=0; i<n; ++i)
printf("%i ", a[i]);
}
我的伪代码:
Bubblesort2( A )
m:=length( A ) - 1
repeat
OK := true
for i := 0 to m-1 do
if Ai > Ai+1 then
Ai <=>Ai+1
OK := false
m := m - 1
until OK
这不行。在C中实现冒泡排序的代码是什么?
答案 0 :(得分:2)
试试这个:
void bubble_sort(int m, int a[100000])
{
int i, ok = 0, v, n = m;
while ( !ok )
{
ok = 1;
for ( i=0; i < m-1; ++i )
{
if ( *(a+i) > *(a+i+1) )
{
v = *(a+i);
*(a+i) = *(a+i+1);
*(a+i+1) = v;
ok = 0;
}
}
m--;
}
for ( i = 0; i < n; ++i )
printf("%i ", a[i]);
}
基本上,初始化ok(使用垃圾值初始化局部变量)。进入循环时也必须设置ok = 1,如果发生交换,则ok = 0。使用for循环没有意义,while循环更具可读性。 m = m - 1
可以替换为m--
,它是相同的,你编写的代码更少。
答案 1 :(得分:2)
void bubble_sort(int m, int a[])
{
int i, ok, v, n=m;
for (ok = 0;!ok;)
{
ok=1;
for (i=0;i<=m-1;++i)
{
if (*(a+i)>*(a+i+1)) { v=*(a+i); *(a+i)=*(a+i+1); *(a+i+1)=v; ok=0; }
}
m=m-1;
}
}
您的代码有两个问题:
这个程序还是一团糟。外部for循环应该是while循环。您应该使用正确的数组访问器a[i]
而不是+ i。此外,源代码中的间距和换行符也不需要任何费用。
答案 2 :(得分:1)
您没有初始化ok
的值,因此行为未定义。
无论如何,您似乎都将ok
的值设置为零。
此外,优化冒泡排序也没有意义。只是简单而有效。如果你想获得良好的性能,那么你根本就不应该使用这个算法。
我建议您阅读维基百科上的algorithm description,尝试用您自己的语言用伪代码编写,确保您理解它,然后实现它。