十大经典基础排序 - 希尔排序

一、希尔排序简介

希尔排序是插入排序的一种更高效的改进版本。希尔排序的基本思想是将待排序的元素按照一定的间隔分成若干组,对每组中的元素进行插入排序,随着间隔的逐渐缩小,每组包含的元素越来越少,当间隔为1时,整个序列被分成了一组,完成排序。

希尔排序的时间复杂度为O(nlogn),比插入排序的时间复杂度O(n^2)要优秀得多。但是,希尔排序的实现相对于其他排序算法来说较为复杂,因此需要仔细理解其实现原理。

二、希尔排序实现

下面我们将使用Java语言来实现希尔排序。首先,我们需要定义一个gap序列来表示每次分组的间隔。在本文中,我们使用Knuth序列作为gap序列。Knuth序列的计算公式为:h = 3 * h + 1(其中h为当前间隔)。

接下来,我们依次对每个间隔进行排序。对于每个间隔,我们将待排序序列分成若干组,对每组进行插入排序。具体实现代码如下:

package com.shanxiyaofeng.learndemo.alg.base;

import java.util.Arrays;

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

    public static void main(String[] args) {
        int[] arr = {3, 28, 95, 75, 1, 5, 13, 100, 88};
        ShellSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void ShellSort(int[] arr) {
        int len = arr.length;
        int temp, gap = len / 2;
        while (gap > 0) {
            for (int i = gap; i < len; i++) {
                temp = arr[i];
                int preIndex = i - gap;
                while (preIndex >= 0 && arr[preIndex] > temp) {
                    arr[preIndex + gap] = arr[preIndex];
                    preIndex -= gap;
                }
                arr[preIndex + gap] = temp;
            }
            gap /= 2;
        }
    }

}

在上述代码中,我们首先计算出Knuth序列中最大的间隔,并使用while循环对每个间隔进行排序。在每个间隔下,我们使用插入排序对每个组进行排序,并将结果合并到一起。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值