首页 > 代码库 > 高级排序之希尔排序
高级排序之希尔排序
希尔排序对于多达几千个数据项的,中等大小规模的数组排序表现良好,希尔排序不像快速排序和其它时间复杂度为O(n*logn)的排序算法那么快,因此,对非常大的文件排序,它不是最优选择,但是希尔排序比选择排序和插入排序这种时间复杂度为O(n²)的排序要快的多,并且它非常容易实现,代码简短
希尔排序也是插入排序的一种,在插入排序中,如果最小的数在最后面,则复制的次数太多,而希尔解决了这个问题,它也是n-增量排序,它的思想是通过加大插入排序中元素的间隔,并在这些有间隔的元素中进行插入排序,当这些数据项排过一趟序后,希尔排序算法减小数据项的间隔再进行排序,依此进行下去。进行这些排序时数据项之间的间隔被称为增量,并且习惯上用字母h来表示。
对于某个马上要进行希尔排序的数组,开始的间隔应该更大,然后间隔不段减小,直到间隔变为1.
间隔序列:
间隔序列中的数字素质通常被认为很重要-除了1之外它们没有公约数,这个约束条件使每趟排序更有可能保持前一趟排序已排好的效果,对于不同的间隔序列,有一个绝对的条件,就是逐渐减小的间隔最后一定要等于1.因此最后一趟是一次普通的插入排序。
下面列出的例子是h=h*3+1的规律得出的:
1 package com.jll.sort; 2 3 public class ShellSort { 4 int[] arr; 5 int size; 6 7 public ShellSort() { 8 super(); 9 }10 11 public ShellSort(int size) {12 this.size = size;13 arr = new int[size];14 }15 16 17 18 /**19 * @param args20 */21 public static void main(String[] args) {22 ShellSort ss = new ShellSort(10);23 for(int i=0;i<10;i++){24 ss.arr[i] = (int) ((Math.random()*100)+1);25 System.out.print(ss.arr[i]+" ");26 }27 ss.shellSort();28 System.out.println();29 System.out.println("after sort:");30 for(int i=0;i<10;i++){31 System.out.print(ss.arr[i]+" ");32 }33 34 }35 36 public void shellSort(){37 int h = 1;38 while(h<=size/3){39 h = h*3+1;40 }41 for(;h>0;h=(h-1)/3){42 for(int i=h;i<size;i++){43 int temp = arr[i];44 int j = i;45 while(j>h-1&&arr[j-h]>temp){46 arr[j]=arr[j-h];47 j-=h;48 }49 arr[j]=temp;50 }51 }52 }53 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。