早上鮮血來潮想寫個希爾排序演算法,發現發生了錯誤,一直不解,最初寫的**如下所示:
static void shellsort(int datalist,int dk)else
}datalist[flag] = temp;
} print(datalist);
}
想呼叫它試試,卻發現
錯誤原因在於紅色**注釋處的判斷條件,希爾排序的規則,應該以待插入的元素為依據,假如待插入的元素大小為temp,所在位置為k,增量為dk,則應該把所有滿足k-=dk且k-=dk所在位置元素大於temp的元素右移dk個位置,但是上述**卻不是以temp為主來判斷大小,而是以k-dk和k所在位置的元素為依據,這樣最終插入temp元素的位置可能不是最合理的位置,就可能會出現如中顯示的錯誤。
正確的希爾排序如下所示
正確**1:
static void shellsort(int datalist,int dk)else
}datalist[flag] = temp;
} print(datalist);
}
正確**2:
static void shellsort(int datalist,int dk)else
}datalist[flag] = temp;
} print(datalist);
}
注意**紅色注釋處,所有的判斷應與temp元素比較。
Java資料結構之希爾排序
希爾排序借用了插入排序,演算法先將要排序的一組數按某個增量gap n 2,n為要排序數的個數 分成若干組,每組中記錄的下標相差gap.對每組中全部元素進行直接插入排序,然後再用乙個較小的增量 gap 2 對它進行分組,在每組中再進行直接插入排序。當增量減到1時,進行直接插入排序後,排序完成。clas...
java資料結構之希爾排序
希爾排序也成為 縮小增量排序 其基本原理是,現將待排序的陣列元素分成多個子串行,使得每個子串行的元素個數相對較少,然後對各個子串行分別進行直接插入排序,待整個待排序列 基本有序 後,最後在對所有元素進行一次直接插入排序。因此,我們要採用跳躍分割的策略 將相距某個 增量 的記錄組成乙個子串行,這樣才能...
資料結構之希爾排序
直接插入排序在資料量較小而且接近 正序 的時候,時間複雜度可以小至o n 所以如果我們能夠讓資料量變小且變得接近 正序 然後用直接插入排序就好了。希爾排序就是做這麼個事情,它首先將資料拆成幾部分,即達到縮小資料規模排序,再將資料合併起來,達到整體的 正序 然而將資料的正序並非區域性的 正序 即不是 ...