我正在學習 C 編程,目前正在學習一種經典的插入排序演算法。
對于背景關系化,我有一組 3 個陣列要測驗:
- 第一個無序的
- 第二個是降序排列
- 最后一個是有序的,但在 2 個元素之間進行了交換。
這是我的代碼:
int insertionSort(int* tab, int n){
int i;
for (i=1; i<n; i ){
int j = i;
while(tab[j] < tab[j-1]) {
swap(&tab[j-1], &tab[j]);
j-=1;
}
}
affiche(tab, n);
return 0;
}
對于最后兩個陣列,它作業正常。但是對于我得到的第一個:
6 6 7 8 10 32521 14 15 17 19 20 21 23 25 26 28 28 28 32 32 34 35 38 38 39 43 44 46 48 49 50 58 59 62 64 65 69 71 75 79 79 79 81 84 86 89 92 93 97 99
代替
3 6 6 7 8 10 14 15 17 19 20 21 23 25 26 28 28 28 32 32 34 35 38 38 39 43 44 46 48 49 50 58 59 62 64 65 69 71 75 79 79 79 81 84 86 89 92 93 97 99
如您所見,該演算法適用于大部分陣列,但對于第六個最小值,我有隨機值(有時第一個有 92,93,97...)。
我沒有任何核心轉儲,這意味著我在記憶體中的陣列空間中,但是像 32521 這樣的一些值讓我認為我的索引j在記憶體中走得太遠了。
坦率地說,我看不出問題出在哪里。
uj5u.com熱心網友回復:
看看這個回圈
while(tab[j] < tab[j-1]) {
swap(&tab[j-1], &tab[j]);
j-=1;
}
j 可以快樂地到處跑。需要有一些東西可以檢測到 j isnt < 0(實際上是 < 1,因為您訪問了“tab [j-1]”)
也許
while((j >= 1) && (tab[j] < tab[j-1]) ) {
swap(&tab[j-1], &tab[j]);
j-=1;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462135.html
