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 }

 

posted @ 2019-05-27 16:25  包子的百草园  阅读(2600)  评论(0编辑  收藏  举报