数据结构 | 排序算法总结——(三)希尔排序排序(附Java实现代码)

1.2.3希尔排序

希尔排序又叫缩小增量排序

基本思想:先取一个小于n的整数作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

具体算法步骤:

  • 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  • 按增量序列个数k,对序列进行k 趟排序;
  • 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

实例:

空间效率:仅使用常数个辅助单元,因而空间复杂度为O(1)

时间效率:最坏情况下希尔排序的时间复杂度为O(n^2)

稳定性:相同关键字的记录被划分到不同的子表时,可能会改变它们之间的相对次序,所以是不稳定的排序方法

适用性:仅适用于当线性表为顺序存储的情况

import java.util.Scanner;
import java.util.Arrays;
public class ShellSort {
    public static void shellInsert(int[] arr) {
        for (int dis = arr.length/2;dis>0;dis = dis/2){
            for (int i=dis;i<arr.length;i++){
                // 开始组内比较
                int temp = arr[i];
                int j = i-dis;
                while (j>=0 && temp < arr[j]){   // 前面的比后面的大,则交换位置
                    arr[j+dis] = arr[j];   // 大的放到后面来
                    j = j - dis;    
                }
                arr[j+dis] = temp;
                
            }
        }
        System.out.println("希尔排序:"+Arrays.toString(arr));
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);//Scanner工具类键盘输入数据
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            if (n > 0) {
                int arr[] = new int[n];
                for (int i = 0; i < n; i++) {
                    arr[i] = scanner.nextInt();
                }
                shellInsert(arr);//调用希尔排序shellInsert方法
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值