排序算法--希爾排序(Shell Sort)_C#程序實現
排序(Sort)是計算機程序設計中的一種重要操作,也是日常生活中經常遇到的問題。例如,字典中的單詞是以字母的順序排列,否則,使用起來非常困難。同樣,存儲在計算機中的數據的次序,對於處理這些數據的算法的速度和簡便性而言,也具有非常深遠的意義。
1.基本概念
排序是把一個記錄(在排序中把數據元素稱為記錄)集合或序列重新排列成按記錄的某個數據項值遞增(或遞減)的序列。
2希爾排序(Shell Sort)
1959年Shell發明,第一個突破O(n2)的排序算法,是簡單插入排序的改進版。它與插入排序的不同之處在於,它會優先比較距離較遠的元素。希爾排序又叫縮小增量排序。
2.1算法描述
-
先將整個待排序的記錄序列分割成為若干子序列分別進行直接插入排序,具體算法描述:
- 選擇一個增量序列t1,t2,…,tk,其中ti>tj,tk=1;
- 按增量序列個數k,對序列進行k 趟排序;
- 每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子序列,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。
2.2動態圖演示

2.3C#代碼實現希爾排序
希爾排序
/// <summary> /// 希爾排序 /// </summary> /// <param name="array"></param> public static int[] ShellSort(int[] array) { int length = array.Length; int k = 1; for (int h = length / 2; h > 0; h = h / 2) { for (int i = h; i < length; i++) { int temp = array[i]; if (temp.CompareTo(array[i - h]) < 0) { for (int j = 0; j < i; j += h) { if (temp.CompareTo(array[j]) < 0) { temp = array[j]; array[j] = array[i]; array[i] = temp; } } } } printArray(array); Console.WriteLine("第" + (k++) + "趟"+" 增量"+h); } return array; }
打印數組
1 /// <summary> 2 /// 打印數組 3 /// </summary> 4 /// <param name="array"></param> 5 private static void printArray(int[] array) 6 { 7 if (array == null || array.Length <= 0) 8 { 9 return; 10 } 11 for (int i = 0; i < array.Length; i++) 12 { 13 Console.Write("["+array[i]+"]"+","); 14 } 15 }
測試代碼:
1 //希爾排序 2 int[] arrayTest4 = new int[] { 9, 8, 5, 6, 7, 4, 3, 2, 1 }; 3 Console.WriteLine("\n------------原數組--------------"); 4 printArray(arrayTest4); 5 Console.WriteLine("\n------------希爾排序--------------"); 6 int[] resultArray4 = ShellSort(arrayTest4); 7 Console.WriteLine("排序結果:"); 8 printArray(resultArray4);
運行結果:

