希尔排序

希尔排序是插入排序的一种,又称“缩小增量排序”,是插入排序算法的一种更高效的改进版本。
需求
排序前:{9,1,2,5,7,4,8,6,3,5}
排序后:{1,2,3,4,5,5,6,7,8,9}java

排序原理

1.选定一个增加量h,按照增加量h做为数据分组的依据,对数据进行分组;
2.对分好组的每一组数据完成插入排序;
3.减少增加量,最小减为1,重复第二步操做。


增加量h的肯定:增加量h的值每一固定的规则,咱们这里采用如下规则:算法

int h = 1;
while (h < a.length){
  h = 2*h+1;
}

 //减少h的值
h=h/2;

希尔排序的API设计

希尔排序的代码实现

import java.util.Arrays;

/**
 * @author: ChengLong
 * @datetime: 2021/5/23 9:50
 */
public class Demo04Shell {


    public static void main(String[] args) {
        Integer[] arr = {9,1,2,5,7,4,8,6,3,5};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }

    /*
     1.对数组内的元素进行排序
    * */
    public static void sort(Comparable[] a) {
        // 一、根据数组a的长度肯定增加量h的初始值
        int h = 1;
        while (h < a.length){
            h = 2*h+1;
        }
        // 二、希尔排序
        while (h>=1){
            //排序
            //2.1找到待插入的元素
            for (int i = h;i<a.length;i++){
                //2.2把待插入的元素插入到有序元素中
                for (int j = i;j>=h;j-=h){
                    //待插入的元素是a[j],比较a[j]和a[j-h]
                    if (greater(a[j-h],a[j])){
                        //交换元素
                        exch(a,j-h,j);
                    }else {
                        //待插入元素已经找到了合适的位置,结束循环
                        break;
                    }
                }
            }
            //减少h的值
            h=h/2;
        }
    }
    /*2.:判断v是否大于w
     * */
    private static boolean greater(Comparable v,Comparable w){

        return v.compareTo(w) > 0;
    }

    /*
     3.交换a数组中,索引i和索引j处的值
    * */
    private static void exch(Comparable[] a,int i,int j){
        Comparable temp;
        temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}

希尔排序的时间复杂度分析

在希尔排序中,增加量h并无固定的规则,有不少论文研究了各类不一样的递增序列,但都没法证实某个序列是最
好的,对于希尔排序的时间复杂度分析,已经超出了咱们课程设计的范畴,因此在这里就不作分析了。数组

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息