排序(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);