数组之希尔排序

数组之希尔排序

基本思想:先将原表按增量ht分组,每个子文件按照直接插入排序。再用下一个增量ht/2将文件再分为子文件,再直接插入法排序。直到ht=1时整个文件排好序。直接插入排序其实就是增量为1的希尔排序。

关键:选择合适的增量!

代码

package com.sun.base.Array.text;
/**
 * @Author: fei
 * @CreateTime:2020-11-26
 */

import java.util.Arrays;

public class Demo06 {
    public static void main(String[] args) {
        int[] arr = new int[]{10,20,5,3,1,2,-7,-8,-55,100,-5};
        for(int h = arr.length/2;h>0;h=h/2){//合理的选取这个增量,然后不断缩小
            for(int i = h;i<arr.length;i++){
                for(int j = i;j>h-1;j-=h){
                    if (arr[j] < arr[j - h]) {
                        int t = arr[j];
                        arr[j] = arr[j - h];
                        arr[j - h] = t;
                    }
            }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

运行

Knuth序列

我们第一次的增量选择数组长度的一半并不是最好的选择,我们可以选择一种叫做克努特序列!

//int h=1;
//h=h*3+1;
package com.sun.base.Array.text;
/**
 * @Author: fei
 * @CreateTime:2020-11-26
 */

import java.util.Arrays;

public class Demo06 {
    public static void main(String[] args) {
        int[] arr = new int[]{10,20,5,3,1,2,-7,-8,-55,100,-5};
        //Kunth序列
        int jiange =1;
        while (jiange<=arr.length/3){
            jiange=jiange*3+1;
        }
        for(int h = jiange;h>0;h=h/2){
           for(int i = h;i<arr.length;i++){
                for(int j = i;j>h-1;j-=h){
                   if (arr[j] < arr[j - h]) {
                       int t = arr[j];
                       arr[j] = arr[j - h];
                       arr[j - h] = t;
                   }
           }
            }
       }
        System.out.println(Arrays.toString(arr));
    }
}

posted @ 2020-11-30 17:15  某人很酷  阅读(64)  评论(0)    收藏  举报