排序(Sort)是計算機程序設計中的一種重要操做,也是平常生活中常常遇到的問題。例如,字典中的單詞是以字母的順序排列,不然,使用起來很是困難。一樣,存儲在計算機中的數據的次序,對於處理這些數據的算法的速度和簡便性而言,也具備很是深遠的意義。算法
排序是把一個記錄(在排序中把數據元素稱爲記錄)集合或序列從新排列成按記錄的某個數據項值遞增(或遞減)的序列。數組
1959年Shell發明,第一個突破O(n2)的排序算法,是簡單插入排序的改進版。它與插入排序的不一樣之處在於,它會優先比較距離較遠的元素。希爾排序又叫縮小增量排序。 測試
先將整個待排序的記錄序列分割成爲若干子序列分別進行直接插入排序,具體算法描述:spa
/// <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);