shell排序

1.shell排序简介

希尔排序按其设计者希尔(Donald Shell)的名字命名,它是一种基于插入排序的快速排序算法,要了解希尔排序,必须先掌握插入排序的原理与实现。

希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。

步长的选择是希尔排序的重要部分。只要最终步长为1任何步长序列都可以工作(且步长要小于数组长度)。算法最开始以一定的步长进行排序。然后会继续以一定步长进行排序,最终算法以步长为1进行排序。当步长为1时,算法变为插入排序,这就保证了数据一定会被排序


2.shell排序图解
在这里插入图片描述

3.代码

复制代码
public class ShellSort {
    public static void main(String[] args) {
        int[] arr = {8,9,1,7,2,3,5,4,6,0};
        shellSort1(arr);
        shellSort2(arr);
    }

    /**
     * 交换法实现shell排序
     * @param arr
     */
    public static void shellSort1(int[] arr){
        System.out.println("交换法实现shell排序:");
        //用于交换
        int temp = 0;
        //确定每组元素的数目,gap为每组元素的数目
        for (int gap = arr.length/2;gap>0;gap /= 2){

            //对元素进行分组,每组元素个数i<arr.length
            //i++:第gap个数后面的所有数都要判断是否交换
            for (int i=gap;i<arr.length;i++){
                //遍历每组的元素,判断其是否交换
                for (int j = i-gap;j>=0;j -= gap){
                    //如果后前面的元素大于后面的元素,则交换
                    if (arr[j] > arr[j+gap]){
                        temp = arr[j];
                        arr[j]=arr[j+gap];
                        arr[j+gap]=temp;
                    }
                }
            }
            System.out.println(Arrays.toString(arr));
        }
    }

    /**
     * 交换法实现shell排序
     * @param arr
     */
    public static void shellSort2(int[] arr){
        System.out.println("交换法实现shell排序:");
        for (int gap = arr.length/2;gap>0;gap /= 2){
            for (int i = gap;i<arr.length;i++){
                int j = i;
                int temp = arr[j];
                if (arr[j]<arr[j-gap]){
                    while (j-gap>=0&&temp<arr[j-gap]){
                        arr[j] = arr[j-gap];
                        j -= gap;
                    }
                    arr[j]=temp;
                }
            }
            System.out.println(Arrays.toString(arr));
        }
    }
}
复制代码

 

posted @   isalo  阅读(817)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示