2014-09-25 51 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