2010-02-27 65 views
-5

我想实现在C.这里冒泡排序算法是我到目前为止有:如何实现冒泡排序在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中实现泡沫排序的代码是什么?

+5

因为这是一项功课:你的第一步应该是使代码可读...我,好吧,V,M,N,A是不可理解的变量名。你的控制流结构也可以改进 - 为什么你使用的结构像((!!ok; ok = 1)? – tanascius

+2

我见过'*(a + i + 1)'在初学者的问题中经常出现 - 教授是这样教的,或者为什么不是人们使用'a [i + 1]'? – AndiDog

+0

你真的会尝试冒泡排序一个100K数组吗? –

回答

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--,它是一样的东西,你写的代码少。

+10

提供完整的作业题目代码通常在这里不受欢迎。它鼓励人们在不理解问题的情况下复制和粘贴。 –

+0

for(i = 1; i Kalozka1

+3

@Mark Byers:我解释了这些问题,OP显示了他自己试图解决问题的尝试。对不起,如果我不应该发布完整的代码,我认为在这种情况下可以确定(几乎是工作)。 – IVlad

1

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

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

另外,没有意义的优化气泡排序。只要简单一点就行了。如果你想要很好的性能,那么你根本不应该使用这个算法。

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

+0

减少m很好:在每一步中,最大的元素将达到它的最终位置,所以在下一步中没有必要检查它。 – IVlad

+0

@IVlad:是的,只是解决了这个问题。不幸的是,即使进行了这种优化,它仍然是O(n * n)。 –

+0

+1对于维基建议 – Shaihi

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. 确定在开始未定义所以它不是明确的条件是否for循环会满意与否。
  2. for语句中的第3个子句(update子句)在迭代括号中的代码之后,但在再次检查条件之前执行。所以你设置为1,然后检查ok = 0。因此,它只进行1次迭代。

这个程序还是一团糟。外循环应该是一个while循环。你应该使用适当的数组访问器a[i]而不是+ i。源代码中的间隔和换行符也不需要任何费用。