希尔排序的几种实现方式

这篇博客探讨了希尔排序的两种实现方式——交换式和移位式,以及它们在处理80000个随机元素数组时的性能差异。交换式实现耗时11521ms,而移位式实现仅需17ms。此外,单独的交换法插入排序用时5121ms,移位法插入排序为741ms。移位式实现展现出更高的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学习希尔排序时,可以通过使用交换式实现,也可以通过移位式实现

以下所有时间都是按照对一个随机生成的大小为80000的数组进行排序过程所用时间

第一种,交换式实现,这种方式在最后一轮,也就是分成一组,步长为1时,完成了一次交换式的插入排序,总共花费了11521ms,但是如果只运行最后一组,也能实现排序,花费5121ms(和交换法实现插入排序差不多)

//交换法实现希尔排序  11521ms
public static void shellSort1(int[] arr) {
        int temp = 0;
        for (int gap=arr.length/2;gap>0;gap/=2){
            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;
                    }
                }
            }
        }
}

//交换法实现插入排序  5121ms
public static void insertSort(int[] arr){
    int temp=0;
        for (int i=1;i<arr.length;i++){
            for (int j=i-1;j>=0;j--){
                if (arr[j]>arr[j+1]){
                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
}

第二种,移位式实现,这种方式在最后一轮也完成了一组完整的插入排序,耗时17ms,原先单独的一组移位式的插入排序时间是741ms

//移位式实现希尔排序  17ms
public static void shellSort2(int[] arr){
        int insertVal=arr[0];
        int insertIndex=0;
        for (int gap=arr.length/2;gap>=1;gap/=2){
            for (int i=gap;i<arr.length;i++){
                insertVal=arr[i];
                insertIndex=i-gap;
                while (insertIndex>=0 && insertVal<arr[insertIndex]){
                    arr[insertIndex+gap]=arr[insertIndex];
                    insertIndex-=gap;
                }
                if ((insertIndex+gap)!=i){
                    arr[insertIndex+gap]=insertVal;
                }
            }
        }
}

//移位式实现插入排序  741ms
 public static void insertSort(int[] arr){
        int insertVal=arr[1];
        int insertIndex=1;

        for (int i=1;i<arr.length;i++){
            insertIndex=i-1;
            insertVal=arr[i];
            while (insertIndex>=0 && insertVal<arr[insertIndex]){
                arr[insertIndex+1]=arr[insertIndex];
                insertIndex--;
            }
            if (!(insertIndex+1==i)){
                arr[insertIndex+1]=insertVal;
            }
        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值