如何在C中实现冒泡排序

时间:2010-02-27 12:07:26

标签: c sorting bubble-sort

我正在尝试在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中实现冒泡排序的代码是什么?

3 个答案:

答案 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;
    }
    }

您的代码有两个问题:

  1. ok在开始时未定义,因此不清楚for循环上的条件是否会被满足。
  2. for语句中的第3个子句(update子句)在迭代括号中的代码之后但在再次检查条件之前执行。所以你设置ok为1然后检查ok = 0.因此它只进行了1次迭代。
  3. 这个程序还是一团糟。外部for循环应该是while循环。您应该使用正确的数组访问器a[i]而不是+ i。此外,源代码中的间距和换行符也不需要任何费用。

答案 2 :(得分:1)

您没有初始化ok的值,因此行为未定义。

无论如何,您似乎都将ok的值设置为零。

此外,优化冒泡排序也没有意义。只是简单而有效。如果你想获得良好的性能,那么你根本就不应该使用这个算法。

我建议您阅读维基百科上的algorithm description,尝试用您自己的语言用伪代码编写,确保您理解它,然后实现它。