java高级排序之希尔排序
2015-04-08 22:46
627 查看
希尔排序对于多达几千个数据项的,中等大小规模的数组排序表现良好,希尔排序不像快速排序和其它时间复杂度为O(n*logn)的排序算法那么快,因此,对非常大的文件排序,它不是最优选择,但是希尔排序比选择排序和插入排序这种时间复杂度为O(n²)的排序要快的多,并且它非常容易实现,代码简短
希尔排序也是插入排序的一种,在插入排序中,如果最小的数在最后面,则复制的次数太多,而希尔解决了这个问题,它也是n-增量排序,它的思想是通过加大插入排序中元素的间隔,并在这些有间隔的元素中进行插入排序,当这些数据项排过一趟序后,希尔排序算法减小数据项的间隔再进行排序,依此进行下去。进行这些排序时数据项之间的间隔被称为增量,并且习惯上用字母h来表示。
对于某个马上要进行希尔排序的数组,开始的间隔应该更大,然后间隔不段减小,直到间隔变为1.
间隔序列:
间隔序列中的数字素质通常被认为很重要-除了1之外它们没有公约数,这个约束条件使每趟排序更有可能保持前一趟排序已排好的效果,对于不同的间隔序列,有一个绝对的条件,就是逐渐减小的间隔最后一定要等于1.因此最后一趟是一次普通的插入排序。
下面列出的例子是h=h*3+1的规律得出的:
package com.jll.sort; public class ShellSort { int[] arr; int size; public ShellSort() { super(); } public ShellSort(int size) { this.size = size; arr = new int[size]; } /** * @param args */ public static void main(String[] args) { ShellSort ss = new ShellSort(10); for(int i=0;i<10;i++){ ss.arr[i] = (int) ((Math.random()*100)+1); System.out.print(ss.arr[i]+" "); } ss.shellSort(); System.out.println(); System.out.println("after sort:"); for(int i=0;i<10;i++){ System.out.print(ss.arr[i]+" "); } } public void shellSort(){ int h = 1; while(h<=size/3){ h = h*3+1; } for(;h>0;h=(h-1)/3){ for(int i=h;i<size;i++){ int temp = arr[i]; int j = i; while(j>h-1&&arr[j-h]>temp){ arr[j]=arr[j-h]; j-=h; } arr[j]=temp; } } } }
您可能感兴趣的文章:
相关文章推荐
- Java高级排序(希尔排序,快速排序,堆排序,归并排序,桶排序)
- Java数据结构与算法(19) - ch07高级排序(希尔排序)
- java数据结构与算法-高级排序-希尔排序
- Java实现常见排序--希尔排序、快排序、堆排序、归并排序等Java实现代码
- java类实现数组的五种排序 冒泡排序、选择排序、插入排序、希尔排序、数组排序
- Java数据结构与算法--高级排序
- Java程序排序之希尔排序
- 算法学习(11)--高级排序之希尔排序
- 处理海量数据的高级排序之——希尔排序(C++)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序
- 排序算法(二)_希尔排序、快速排序、归并排序的Java实现
- (十四)高级排序—希尔排序
- java数组排序示例(冒泡排序、快速排序、希尔排序、选择排序)
- java排序-希尔排序
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
- 算法学习(11)--高级排序之希尔排序
- 用JAVA实现排序算法之五:希尔排序
- (数据结构与算法分析 八)------插入排序,希尔排序,归并排序的实现( Java语言描述)
- java五种内部排序(直接插入排序、希尔排序、快速排序、堆排序、归并排序)