排序算法-插入排序之希尔排序
2017-08-22 17:09
218 查看
希尔排序是插入排序的一种。
首先我们来了解一个定理:交换相邻元素的任何排序算法平均时间为O(N^2)。
所以希尔排序通过比较一定间隔的元素来进行工作,各趟距离随算法减小,最后比较相邻元素完成排序。也就是说原来的插入排序是相邻的元素比较,而希尔排序是具有间隔的插入排序,这个间隔就是这个序列。
希尔排序使用增量序列:h1,h2,h3…ht;h1=1。使得每趟排序使数组a[i]<=a[i+hk]。最后一趟使a[i]<=a[i+1]。希尔排序也叫缩减增量排序。
![](https://img-blog.csdn.net/20170822202257719?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3oxMjI2ODY0NDEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
增量序列一个流行的序列是Shell(算法创造人)建议建议的,ht=N/2,向下取整,hk=h(k+1)/2,向下取整,一直取到1为止。例如该数组有10个元素,那么序列为:5,2,1。(不要被上面那个图片误导)
代码
希尔排序最好的时间复杂度为O(N),平均为O(N^3/2),最差为O(N^2)。但这一切取决于增量序列,希尔增量序列的时间复杂度最差为O(N^2),Hibbard序列最差的时间复杂度为O(N^3/2)。适合小规模数据。
Hibbard增量序列:{1, 3, …, 2^k-1}
首先我们来了解一个定理:交换相邻元素的任何排序算法平均时间为O(N^2)。
所以希尔排序通过比较一定间隔的元素来进行工作,各趟距离随算法减小,最后比较相邻元素完成排序。也就是说原来的插入排序是相邻的元素比较,而希尔排序是具有间隔的插入排序,这个间隔就是这个序列。
希尔排序使用增量序列:h1,h2,h3…ht;h1=1。使得每趟排序使数组a[i]<=a[i+hk]。最后一趟使a[i]<=a[i+1]。希尔排序也叫缩减增量排序。
增量序列一个流行的序列是Shell(算法创造人)建议建议的,ht=N/2,向下取整,hk=h(k+1)/2,向下取整,一直取到1为止。例如该数组有10个元素,那么序列为:5,2,1。(不要被上面那个图片误导)
代码
public class ShellSort { @Test public void test(){ Integer[] array = new Integer[]{10,54,55,47,50,20,41,33,40,70}; sort(array); for(int i = 0; i < array.length; i++){ System.out.print(array[i]+" "); } System.out.println(); } public static <T extends Comparable<? super T>> void sort(T[] array){ int length = array.length; T temp = null; for(int i = length/2; i >= 1; i /= 2){ for(int x = i; x < length; x++){ for(int y = x - i; y >= 0; y -= i){ if(array[y].compareTo(array[y+i]) > 0){ temp = array[y]; array[y] = array[y+i]; array[y+i] = temp; }else { break; } } } } } }
希尔排序最好的时间复杂度为O(N),平均为O(N^3/2),最差为O(N^2)。但这一切取决于增量序列,希尔增量序列的时间复杂度最差为O(N^2),Hibbard序列最差的时间复杂度为O(N^3/2)。适合小规模数据。
Hibbard增量序列:{1, 3, …, 2^k-1}
相关文章推荐
- 排序算法(1):插入排序,选择排序,希尔排序,堆排序
- C语言8种排序算法及其实现 1.希尔排序 2.二分插入法 3.直接插入法 4.带哨兵的直接排序法 5.冒泡排序 6.选择排序 7.快速排序 8.堆排序
- 排序算法 - 快速插入排序和希尔排序
- 排序算法: 冒泡排序, 快速排序,希尔排序,直接插入排序 ,直接选择排序,归并排序,堆排序
- 排序算法java 一 --快速排序、直接插入、希尔排序
- 改进排序算法:希尔排序(对直接插入排序的改进)
- 数据结构与算法:七种排序算法总结(冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序、快速排序)
- 数据结构6-排序算法(直接插入排序、希尔排序、快速排序、归并排序和堆排序)
- 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序
- 排序算法汇总(选择排序 ,直接插入排序,冒泡排序,希尔排序,快速排序,堆排序)
- 排序算法汇总(选择排序 ,直接插入排序,冒泡排序,希尔排序,快速排序...)
- C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序
- 6种排序算法及其比较 简单选择排序,堆排序,简单插入排序,希尔排序,冒泡排序,快速排序,归并排序
- Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- 【排序算法 】希尔排序 shell sort(插入类排序)
- 排序算法总结(一)---- 直接插入排序,希尔排序(java实现)
- 排序算法(二)、插入排序 —— 直接插入排序 和 希尔排序
- 排序算法--插入排序之希尔排序
- 排序算法之直接插入排序、二分插入排序和希尔排序