插入排序—希尔排序(Shell`s Sort)

发布时间:2018-04-19作者:laosun阅读(1613)

插入排序—希尔排序(Shell`s

java插入排序—希尔排序(Shell`s Sort),先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

    希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进。希尔排序又叫缩小增量排序

    基本思想:

    先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

    操作方法:

    1. 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;

    2. 按增量序列个数k,对序列进行k 趟排序;

    3. 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

    希尔排序的示例:

    1524120623384048327.jpg

    算法实现:

     我们简单处理增量序列:增量序列d = {n/2 ,n/4, n/8 .....1} n为要排序数的个数

    即:先将要排序的一组记录按某个增量dn/2,n为要排序数的个数)分成若干组子序列,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。继续不断缩小增量直至为1,最后使用直接插入排序完成排序。

    /**
     * Java实现希尔排序(缩小增量排序) 
     * 两个步骤:1,建堆  2,对顶与堆的最后一个元素交换位置 
     */
    public class ShellSort {
    
    	public static void main(String[] args) {
    		int a[] = { 3, 1, 5, 7, 2, 4, 9, 6, 10, 8 };
    		ShellSort obj = new ShellSort();
    		System.out.println("初始值:");
    		obj.print(a);
    		obj.shellSort(a);
    		System.out.println("\n排序后:");
    		obj.print(a);
    
    	}
    
    	private void shellSort(int[] a) {
    		int dk = a.length / 2;
    		while (dk >= 1) {
    			ShellInsertSort(a, dk);
    			dk = dk / 2;
    		}
    	}
    
    	private void ShellInsertSort(int[] a, int dk) {// 类似插入排序,只是插入排序增量是1,这里增量是dk,把1换成dk就可以了
    		for (int i = dk; i < a.length; i++) {
    			if (a[i] < a[i - dk]) {
    				int j;
    				int x = a[i];// x为待插入元素
    				a[i] = a[i - dk];
    				for (j = i - dk; j >= 0 && x < a[j]; j = j - dk) {// 通过循环,逐个后移一位找到要插入的位置。
    					a[j + dk] = a[j];
    				}
    				a[j + dk] = x;// 插入
    			}
    
    		}
    
    	}
    
    	public void print(int a[]) {
    		for (int i = 0; i < a.length; i++) {
    			System.out.print(a[i] + " ");
    		}
    	}
    }

    希尔排序时效分析很难,关键码的比较次数与记录移动次数依赖于增量因子序列d的选取,特定情况下可以准确估算出关键码的比较次数和记录的移动次数。目前还没有人给出选取最好的增量因子序列的方法。增量因子序列可以有各种取法,有取奇数的,也有取质数的,但需要注意:增量因子中除1 外没有公因子,且最后一个增量因子必须为1。希尔排序方法是一个不稳定的排序方法。

0 +1

版权声明

 Java  源码  算法

 请文明留言

0 条评论