基础算法--希尔排序

本文介绍了希尔排序的基本思想和步骤,它通过设置增量对数组进行分组,并对每组进行插入排序。随着增量逐渐减少,每组包含的元素增多,最终达到整个数组有序。示例代码展示了希尔排序的Java实现,可用于理解该排序算法的工作原理。
摘要由CSDN通过智能技术生成

小思路:

希尔排序是把数组按照下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的元素越来越多,当增量减至1时,整个元素恰被分成一组,算法便终止。

算法思想: 

通过增量对数组进行分组排序,例:数组长度为10的话,10 /2 增量为 5,第一组元素下标0,5,10……,第二组 1,6 ,11……, 以此类推然后对每组内进行插入排序

分组:增量=数组长度/2,每组进行插入排序,然后交换位置,再缩小增量,分组再插入排序,增量越来越小,每组元素越多,当增量减至1时,整个元素恰被分成一组,算法便终止。

最外层循环循环的是增量,每轮/2, 当等于 1 时结束算法。

代码示例:

public class ShellSort {
    //  希尔排序
    //    通过增量对数组进行分组排序,例:数组长度为10的话,10 /2 增量为 5,第一组元素下标0,5,10……,
    //    第二组 1,6 ,11……, 以此类推然后对每组内进行插入排序
    //    分组:增量=数组长度/2,每组进行插入排序,然后交换位置,再缩小增量,分组再插入排序,
    //    增量越来越小,每组元素越多,当增量减至1时,整个元素恰被分成一组,算法便终止。
    //   希尔排序方法,接收一个数组
    public static void shellSort(int[] arr){
        int len=arr.length;//拿到数组长度
        //外层循环控制增量,最常用的是一开始 增量/2
        for(int gap=len/2;gap>0;gap/=2){ //gap 为 1 时 即可结束算法因此gap>0,,每轮增量减少 gap/2
            //插入排序时从后跟前进行比较排序。。。
            //每趟从分组后每组的后一个开始跟前面比较//每组后一个即为 gap,
            for(int i=gap;i<arr.length;i++){
                //每次每组的后一个跟前一个元素比较//每组前一个元素就是当前元素减去增量,
                for(int k=i;k>=gap;k-=gap){
                    //判断每组元素大小
                    if(arr[k]>arr[k-gap]){
                        swap(arr,k,k-gap);
                    }else{
                        break; //大小位置合适,不需要交换则 break
                    }
                }
            }
        }
    }
    //交换两个变量
    public static void swap(int[] arr,int a,int b){
        int temp=arr[a];
        arr[a]=arr[b];
        arr[b]=temp;
    }
    public static void main(String[] args) {
        int arr[]={1,2,5,7,3,12,8,43,8756,34,2};
    //调用希尔排序
shellSort(arr);
        System.out.println(Arrays.toString(arr));
    }

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值