插入排序和希爾排序(Java實現)
阿新 • • 發佈:2018-12-23
1、插入排序
插入排序就是每一步都將一個待排資料按其大小插入到已經排序的資料中的適當位置,直到全部插入完畢。
2、插入排序Java程式碼實現
/**
* @Comment 插入排序
* @Author Ron
* @Date 2017年11月9日 上午11:53:06
* @return
*/
static void insertSort(int[] source){
for(int i=1; i < source.length; i++){
if(source[i-1] > source[i]){
int insertData = source[i];
int j=i;
while (j > 0 && source[j-1] > insertData) {
source[j]=source[j-1];
j--;
}
source[j]=insertData;
}
}
}
3、希爾排序
希爾排序演算法是插入排序的一種更高效的改進版本。它的作法不是每次一個元素挨一個元素的比較。而是初期選用大跨步(增量較大)間隔比較,使記錄跳躍式接近它的排序位置;然後增量縮小;最後增量為 1 ,這樣記錄移動次數大大減少,提高了排序效率。希爾排序對增量序列的選擇沒有嚴格規定。
希爾排序是基於插入排序的以下兩點性質而提出改進方法的:
- 插入排序在對幾乎已經排好序的資料操作時, 效率高, 即可以達到線性排序的效率
- 但插入排序一般來說是低效的, 因為插入排序每次只能將資料移動一位
4、希爾排序演算法思路
- 先取一個正整數 d1(d1 < n),把全部記錄分成 d1 個組,所有距離為 d1 的倍數的記錄看成一組,然後在各組內進行插入排序
- 然後取 d2(d2 < d1)
- 重複上述分組和排序操作;直到取 di = 1(i >= 1) 位置,即所有記錄成為一個組,最後對這個組進行插入排序。一般選 d1 約為 n/2,d2 為 d1 /2, d3 為 d2/2 ,…, di = 1
5、希爾排序例項分析
假設有陣列 array = [80, 93, 60, 12, 42, 30, 68, 85, 10],首先取 d1 = 4,將陣列分為 4 組,如下圖中相同顏色代表一組:
然後分別對 4 個小組進行插入排序,排序後的結果為:
然後,取 d2 = 2,將原陣列分為 2 小組,如下圖:
然後分別對 2 個小組進行插入排序,排序後的結果為:
最後,取 d3 = 1,進行插入排序後得到最終結果:
6、希爾排序Java實現
/**
* @Comment 希爾排序
* @Author Ron
* @Date 2017年11月9日 上午11:53:37
* @return
*/
static void shellSort(int[] source){
int group = source.length/2;
while (group > 0) {
for(int i=group; i<source.length; i++){
if(source[i-group] > source[i]){
int insertData = source[i];
int j=i;
while (j > group-1 && source[j-group] > insertData) {
source[j]=source[j-group];
j-=group;
}
source[j]=insertData;
}
}
group = group/2;
}
}