八大排序算法 —— 希尔排序

希尔排序,又称缩减增量排序。

核心思想:希尔排序是通过分组(拆半分组),通过组内排序,每次分组后分组间隔再一次拆半,一直循环下去,找到分组间隔gap=1,使用直接插入排序完成最后的排序。

图解:
这里写图片描述


希尔排序的时间复杂度是:O(n2) ;空间复杂度是O(1) ,希尔排序是一个不稳定的排序,相同的变量在排序后可能与之前的顺序不一样。
比如:初始的数组为:6,7,5(1),9,1,2,4,5(2)。
通过希尔排序之后,序列为:1,2,4,5(2),5(1),6,7,9
排序前的5(1)在5(2)的前面,排序过后,5(1)在5(2)的后面。所以,希尔排序是一个不稳定的排序。

JAVA代码实现:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int []data  = new int[8];
        for(int i= 0;i<data.length ;i++){
            data[i] = sc.nextInt();
        }
        data = shell(data);
        for(int i = 0;i<data.length ;i++){
            System.out.print(data[i]+" ");
        }

    }

    //希尔排序的算法实现
    public static int[] shell(int[] arrays){
        if(arrays == null || arrays.length <= 1){
            return arrays;
        }
        //增量
        int incrementNum = arrays.length/2;
        while(incrementNum >=1){
            for(int i=0;i<arrays.length;i++){
                //进行插入排序
                for(int j=i;j<arrays.length-incrementNum;j=j+incrementNum){
                    if(arrays[j]>arrays[j+incrementNum]){
                        int temple = arrays[j];
                        arrays[j] = arrays[j+incrementNum];
                        arrays[j+incrementNum] = temple;
                    }
                }
            }
            //设置新的增量
            incrementNum = incrementNum/2;
        }
        return arrays;
    }
}

猜你喜欢

转载自blog.csdn.net/cqx13763055264/article/details/81634511