排序算法(七.希尔排序-改进的插入排序2)

排序算法(七.希尔排序-改进的插入排序2)

  • 增量序列介绍
  • knuth增量序列
  • 基于knuth增量序列的实现

上篇博客介绍了希尔排序的算法思想及具体实现,本文主要想继续研究下希尔排序中采用的增量序列 (gap序列),上篇博客的实现都是基于Shell 增量序列 即 n/2 实现的。

增量序列介绍

Shell 增量序列
Hibbard 增量序列
Knuth 增量序列
Gonnet 增量序列
Sedgewick 增量序列
此处仅做了简单罗列,有兴趣的同学可以自行查阅资料了解详细介绍哈。

knuth增量序列

本文主要来简单介绍下knuth序列,效率据说会高于shell序列
h = 1
h = 3h + 1
大概序列就是:1, 4, 13 …

基于knuth增量序列的实现

/**
 * 

@filename ShellSort

*

*

@description 基于knuth序列的希尔排序Java实现

* * @author Java猿人一枚 * @version 1.0 * @since 2019/4/2 22:30 **/ public class ShellSort1 { public static void main(String[] args) { int[] nums = new int[]{100,34,52,6,8,78,95}; System.out.println("待排序数组:" + Arrays.toString(nums)); int[] result = shellSortKnuth(nums); System.out.println("已排序数组:" + Arrays.toString(result)); } /** * 基于knuth序列的希尔排序 * * @param nums * @return */ public static int[] shellSortKnuth(int[] nums){ if(null == nums || nums.length == 0){ System.out.println("输入的数组为空!"); return null; } int count = 0; int len = nums.length; //增量序列 int h = 1; while(h <= len /3){ h = h * 3 + 1; } //将h赋值给d int d = h; for(; d > 0; d = (d - 1) / 3){ for(int i = 0; i < d; i++){ //分组插入排序 for(int j = i + d; j < len; j += d){ int temp = nums[j]; int k; //向后移位,直到找到小于nums[j]的 for(k = j - d; k >= 0 && nums[k] > temp; k -= d){ nums[k+d] = nums[k]; count++; } //插入nums[j] nums[k+d] = temp; } } } System.out.println("shellSortKnuth,循环次数:" + count); return nums; } }

效率方面待测试是否高于shell序列

你可能感兴趣的:(算法与数据结构)