• Shell排序算法


    1、Shell排序算法的介绍

      希尔排序,也称递减增量排序算法,是直接插入排序算法的一种高速而稳定的改进版本。

      希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
      先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量=1(<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

    2、Shell排序算法的特点

    • 希尔排序是基于插入排序的以下两点性质而提出改进方法的:
      • 插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率
      • 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位
    • 时间复杂度:最坏情况下为O(n^2),平均时间复杂度为O(nlogn);
    • 空间复杂度:归并排序需要一个大小为1的临时存储空间用以保存合并序列,所以空间复杂度为O(1)
    • 算法稳定性:从上面图片中可以看出,数字5在排序后交换了位置,所以它是不稳定的算法。

    3、Shell排序算法的代码实现

     1 package com.baozi.paixu;
     2 
     3 import java.util.Arrays;
     4 
     5 /**
     6  * 希尔排序算法
     7  * @author BaoZi
     8  * @create 2019-05-15-17:41
     9  */
    10 public class ShellSort {
    11     public static void main(String[] args) {
    12         int[] nums = new int[]{8, 3, 2, 1, 7, 4, 6, 5};
    13         System.out.println("........排序之前的数组........");
    14         System.out.println(Arrays.toString(nums));
    15         System.out.println("........排序之后的数组........");
    16         ShellSort.shellSort(nums);
    17         System.out.println(Arrays.toString(nums));
    18     }
    19 
    20     /**
    21      * shellSort排序算法的实现
    22      * 增量h=(h*3)+1; 这个增量公式是由Knuth给出的
    23      *
    24      * @param nums
    25      */
    26     public static void shellSort(int[] nums) {
    27         int len = nums.length;
    28         //1、首先根据数组的长度确定增量的最大值
    29         int h = 1;
    30         //按h * 3 + 1得到增量序列的最大值
    31         while (h <= len / 3) {
    32             h = h * 3 + 1;
    33         }
    34         //进行增量查找和排序
    35         while (h > 0) {
    36             for (int i = h; i < len; i++) {
    37                 for (int k = i; k < len; k = k + h) {
    38                     //判断是否需要重新排序,如果小于k-h处的值,需要重新排序
    39                     if (nums[k] < nums[k - h]) {
    40                         int temp = nums[k];
    41                         int j = k;
    42                         for (; j >= i && temp < nums[j - h]; j -= h) {
    43                             nums[j] = nums[j - h];
    44                         }
    45                         nums[j] = temp;
    46                     }
    47                 }
    48             }
    49             h = (h - 1) / 3;
    50         }
    51     }
    52 }
  • 相关阅读:
    python 不可变类型
    python 不定长参数
    Codeforces Round #749
    [提高组集训2021] Round1
    AtCoder Regular Contest 128
    [提高组互测] Day6
    [提高组互测] Day5
    [提高组互测] Day1
    [提高组互测] Day2
    [提高组集训2021] 一拳超人
  • 原文地址:https://www.cnblogs.com/BaoZiY/p/10931406.html
Copyright © 2020-2023  润新知