算法--排序--希尔
2016-12-15 00:14
176 查看
希尔是插入排序的姊妹,她在插入的基础上引入了分组的概念,在分组内做插入,然后不断地缩小分组的个数,分组为0即可完成排序。换句话,插入排序是分组为1的希尔排序。
举个例子:现有长度为10的数组[1, 5, 8, 4, 7, 3, 0, 2, 9, 6];
注:希尔排序的整个过程,图中颜色相同的表示处于同一个分组内,元素所处的位置对应着数组的下标。
(1)既然引入了分组gap,不妨就让gap = 10/2(当然这个长度你可以随便设,只是分组越小,小组内插入的效率就越高);也就是分成了5组,如图示。
(2)继续缩小gap,重复小组内的插入排序。gap = 5/2,分成2组,如图示。
(3)重复(2),gap = 2/2;此时相当于普通的插入排序,前面已经说过,插入排序在数据较少且基本有序的状态下,效率是最高的。而此时整体大部分数据处于有序状态,所以很高效。
(4)重复(2),gap = 0;完成排序。
条件:
数据量较小
原理:
(1)选出第一个gap,各个gap内插入;
(2)缩小gap,重复(1);
….
(n)gap为0,打完收工。
时间复杂度:
最优(n)和最差(n^2),平均nlog(n)。记住nlog(n)就行了。
笔面试出现的频率:
除了在线笔试偶尔会考到时间复杂度,面试和现场笔试从来没有考过。
实现:
为了方便记忆,这里写的尽量和插入排序类似,需要的话可以对比着来记。
举个例子:现有长度为10的数组[1, 5, 8, 4, 7, 3, 0, 2, 9, 6];
注:希尔排序的整个过程,图中颜色相同的表示处于同一个分组内,元素所处的位置对应着数组的下标。
(1)既然引入了分组gap,不妨就让gap = 10/2(当然这个长度你可以随便设,只是分组越小,小组内插入的效率就越高);也就是分成了5组,如图示。
(2)继续缩小gap,重复小组内的插入排序。gap = 5/2,分成2组,如图示。
(3)重复(2),gap = 2/2;此时相当于普通的插入排序,前面已经说过,插入排序在数据较少且基本有序的状态下,效率是最高的。而此时整体大部分数据处于有序状态,所以很高效。
(4)重复(2),gap = 0;完成排序。
条件:
数据量较小
原理:
(1)选出第一个gap,各个gap内插入;
(2)缩小gap,重复(1);
….
(n)gap为0,打完收工。
时间复杂度:
最优(n)和最差(n^2),平均nlog(n)。记住nlog(n)就行了。
笔面试出现的频率:
除了在线笔试偶尔会考到时间复杂度,面试和现场笔试从来没有考过。
实现:
为了方便记忆,这里写的尽量和插入排序类似,需要的话可以对比着来记。
public class SheSort { /** * <p>name: main</p> * <p>description: </p> * <p>return: void</p> */ public static void main(String[] args) { // TODO Auto-generated method stub int[] array = { 1, 5, 8, 4, 7, 3, 0, 2, 9, 6, 11, 13, 12, 141, 14, 15, 17, 16, 18, 21, 20, 19, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 40, 39, 38, 37 }; sheSort(array); for (int i = 0; i < array.length; i++) { System.out.print(array[i] + ", "); } } public static void sheSort(int[] array) { int gap = array.length / 5; while (gap > 0) { for (int i = gap; i < array.length; i += gap) { if (array[i] < array[i - gap]) { int temp = array[i]; int j = i - gap; while (j >= 0 && array[j] > temp) { array[j + gap] = array[j]; j -= gap; } /** 容易出错 */ array[j + gap] = temp; } } gap = gap >> 1; } } }
相关文章推荐
- 数据结构-排序算法之插入排序(直接插入,二分插入,希尔,表插入)
- 【java排序】 选择排序,插入排序,希尔算法
- 算法——希尔插入排序
- c# 排序 算法 函数 冒泡 选择 插入 希尔
- 必须知道的八大种排序算法【java实现】(二) 选择排序,插入排序,希尔算法【详解】
- Java实现的排序算法及比较 [冒泡,选择,插入,归并,希尔,快排]
- 必须知道的八大种排序算法【java实现】(二) 选择排序,插入排序,希尔算法【详解】
- 无聊时总结总结算法之02排序(直接插入+希尔)
- 八大种必知排序算法(二) 选择排序,插入排序,希尔算法
- 算法:希尔排序
- 无聊时总结总结算法之02排序(希尔 完结)
- 八大种必知排序算法(二) 选择排序,插入排序,希尔算法(续)
- Java 选择排序、插入排序、希尔算法实例详解
- C 语言算法排序 希尔
- java必须知道的八大种排序算法:冒泡排序、 选择排序、插入排序、快速排序、希尔算法、归并排序算法、基数排序、堆排序算法
- 算法学习--希尔和快速排序
- 必须知道的八大种排序算法【java实现】(二) 选择排序,插入排序,希尔算法【详解】
- 排序算法之希尔(优化冒泡)排序
- 算法--排序(希尔,归并)
- 每天一道算法题8 在排序数组中查找和为给定值的两个数字