1、 簡單插入排序存在的問題
我們看簡單的插入排序可能存在的問題。
陣列 arr = 這時需要插入的數 1(最小), 這樣的過程是:
結論: 當需要插入的數是較小的數時,後移的次數明顯增多,對效率有影響。
2、希爾排序法介紹
希爾排序是希爾(donald shell)於2023年提出的一種排序演算法。希爾排序也是一種插入排序,它是簡單插入排序經過改進之後的乙個更高效的版本,也稱為縮小增量排序。
3、希爾排序法基本思想
4、希爾排序法的示意圖
5、希爾排序法應用例項
請從小到大排序.對 請分別使用
希爾排序時, 對有序序列在插入時採用交換法, 並測試排序速度;
希爾排序時, 對有序序列在插入時採用移動法, 並測試排序速度。
【交換法】逐步推導
第一輪
int temp = 0;
//希爾排序的第一輪
//思路:第一輪排序是將10個資料分成了5組
for(int i=5;i=0;j-=5)
} } system.out.println("希爾排序第一輪後的結果:");
for(int i=0;i第二輪
// 希爾排序的第2輪
// 思路:第二輪排序是將10個資料分成了5/2=2組
for (int i = 2; i < arr.length; i++)
}} system.out.println("希爾排序第二輪後的結果:");
for (int i = 0; i < arr.length; i++)
system.out.println();
第三輪
// 希爾排序的第3輪
// 思路:第一輪排序是將10個資料分成了2/2=1組
for (int i = 1; i < arr.length; i++)
}} system.out.println("希爾排序第二輪後的結果:");
for (int i = 0; i < arr.length; i++)
system.out.println();
最終**
int temp = 0;
int count = 0;
// 根據前面的逐步分析,使用迴圈處理
for (int gap = arr.length / 2; gap > 0; gap /= 2) }}
// system.out.println("希爾排序第"+(++count)+"輪後的結果:");
// for(int i=0;i測試時間
//測試80000個資料
int arr = new int[80000];
for(int i=0;i<80000;i++)
//寫乙個測試時間
可以發現交換法的希爾排序速度非常慢【移動法】
// 對交換式希爾排序進行改進----》移位法
public static void shellsort2(int arr)
// 找到位置
arr[index] = temp;}}
} }
移動法使用了插入排序。
速度極大的提高了。
再附上另一種,思路是一樣的,速度同樣很快
public static void testshellsort(int arr)
arr[k + increment] = temp;}}
}} while (increment > 1);
}
希爾排序比插入排序多了分組,稍微難理解一點。 排序 希爾排序
希爾排序 shell sort 又稱為縮小增量排序,輸入插入排序演算法,是對直接排序演算法的一種改進。本文介紹希爾排序演算法。對於插入排序演算法來說,如果原來的資料就是有序的,那麼資料就不需要移動,而插入排序演算法的效率主要消耗在資料的移動中。因此可知 如果資料的本身就是有序的或者本身基本有序,那麼...
排序 希爾排序
縮小增量排序 待排序列按關鍵字基本有序時,直接插入排序的效率很高 希爾排序思想 將整個待排記錄分割為若干子串行分別進行直接插入排序,待整個序列中的記錄基本有序時,再對全體記錄進行一次直接插入排序,就可以完成整個排序工作 增量序列中的值沒有除1以外的公因子,且最後乙個增量必須等於1 子串行的構成不是逐...
排序 希爾排序
希爾排序是插入排序中的乙個分支,但是較簡單插入排序又有較大的改進,這使得它成為了歷史上第一批突破二次時間屏障的排序演算法之一哦。它是通過比較一定間隔的元素來工作的。因此希爾排序又稱為縮小增量排序。直接插入排序對於原始資料基本有序的情況下,效率較高。在此的基礎上。我們可以想辦法,使資料基本有序,然後利...