高级排序算法之希尔排序(缩小增量排序)

2020-10-28  本文已影响0人  借缕春风绽百花

排序原理:。

①选定一个增长量,以增长量作为数据分组的依据,对数据进行逻辑分组。
②多分组的数据按组进行插入排序。
③减小增长量,重复第二步操作,直到增长量为1。

增长量的确定:

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

时间复杂度:

最好情况:O(n)
最坏情况:O(n^2)
平均情况:O(n^1.3)

空间复杂度:

O(1)

稳定性:

不稳定

实现:

API设计:

①主排序算法用于排序
public static void sort(int[] a)
② 比较API,用于比较两个元素大小
private static boolean greater(int[] a,int v,int w)
③交换API,用于交换两个索引位置的值
private static void exchange(int[] a,int i,int j)

API实现:

    public static void sort(int[] a) {
        //1.确定增长量级
        int h = 1;
        while(h < a.length/2) {
            h = 2*h+1;
        }
        //希尔排序
        //1.找到要排序的元素
        for(int i = 0;i < a.length;i ++) {
            //2.将该元素与该组其他元素比较
            for(int j = i; j >= h;j-=h ) {
                if(greater(a[i-h],a[i])) {
                    exchange(a,i-h,i);
                }else {
                    break;
                }
            }
        }
    }
   
    //greater方法用于获取两数最大值
    private static boolean greater(int v,int w) {
        if(v <= w)
           return false;
        else
            return true;
        
    }
    //exchange方法用于交换两个元素
    private static void exchange(int[] a,int i,int j) {
        int temp = 0;
        temp = (int) a[i];
        a[i] = a[j];
        a[j] = temp;
        
    }
上一篇下一篇

猜你喜欢

热点阅读