2014-09-25 15 views
1

我的代码:(我期望它按升序排序传递数组)。为什么排序alogrithim将无限循环

void sort(int arr[], int n) { 
    int c=0; 

    for(int i = 0; i<n-1; ++i) { 
     if (arr[i]>arr[i+1]) { 
      c=arr[i]; 
      arr[i]=arr[i+1]; 
      arr[i]=c; 
      i=0; 
     } 
    } 

} 

实例阵列:int arr[4]={3,1,2,4};

sort(arr,4); 

错误:无限循环???

+1

对于小型输入设置,手动在纸上(或使用调试器)逐步执行代码。为什么不符合终止条件? – user2864740 2014-09-25 23:40:21

+0

我一直这样做,令人尴尬的2个小时。我的意思是如果数组是3,4,1,2 ..过程应该是这样的:3,1,4,2 .... 1,3,4,2 ... 1,3,2,4。 .1,2,3,4 .. – 2014-09-25 23:42:38

+0

“我”看到你在那里做了什么:) – 2014-09-25 23:42:40

回答

4

用于交换数组中两个连续元素的代码是错误的。替换为if语句中的第一个三行:

c = arr[i]; 
arr[i] = arr[i+1]; 
arr[i+1] = c; 

最后一行是一个我固定的。

该算法被称为bubble sort

编辑:你需要做的,以确保正确排序的另一件事是设置i-1而不是0在if语句的结束。如果你将它设置为0,那么在循环的下一次迭代时,它会增加1,这意味着你的代码不会考虑交换循环的前两个元素。 (感谢Anton Savin的评论。)

+1

哇......我的大脑......有黑洞或其他东西。 – 2014-09-25 23:43:23

+2

@MuhammadUmer也设置了'i = -1'而不是'0',否则例如你会错误地排序'{3,2,1,4}' – 2014-09-25 23:45:41

+0

为什么把-1设置成工作。 – 2014-09-25 23:47:43