Java排序算法之希尔排序

  希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一种更高效的版本,也成为缩小增量排序。

一、算法原理

  现在有一个array,希尔排序就是设定一个增量incrementNum(0<incrementNum<array.length)。

  先从array[0]开始,以incrementNum为增量的进行直接插入排序,直到数组末尾,然后从array[1]开始重复:以incrementNum为增量的进行直接插入排序; 然后从array[1]开始重复......一直到array[n]。

  然后取一个小于上一步增量的新的增量(比如设置为incrementNum/2),对前一个步骤的结果array进行遍历,直接插入排序....

  再取小于上一步增量的新的增量,重复进行:遍历,直接插入排序

  直到新的增量小于1之后再退出循环。

二、举例实现

  比如现在有数组 {82 ,31 ,29 ,71, 72, 42, 64, 5,110}  

  第一次取增量设置为array.length/2 = 4 。先从82开始以4为增量遍历直到末尾,得到(82,42) 排序得到{42 ,31 ,29 ,71, 72, 82, 64, 5,110}。 然后从第二个数31开始重复上一个步骤,得到(31,64) 排序得到{42 ,31 ,29 ,71, 72, 82, 64, 5,110}.......   以4为增量的遍历完数组之后,得到的结果是{42 ,31,5,71,72,82,64,29,110}

  然后重新取增量,设定为incrementNum/2 = 2,对{42 ,31,5,71,72,82,64,29,110}重复步骤1。  

  完事之后,在取新的增量,重复步骤1。 直到取到的增量小于1,退出循环。

三、算法实现

 1 package recursion;
 2 
 3 import java.util.Arrays;
 4 
 5 /**
 6  * @author zsh
 7  * @company wlgzs
 8  * @create 2019-02-16 15:14
 9  * @Describe 希尔排序实现
10  */
11 public class ShellSort {
12 
13     /**
14      * 希尔排序实现方法
15      * @param arr 待排序的数组
16      * @return 排序过的数组
17      * 一趟一个增量,用增量来分组,组内执行插入排序
18      */
19     static int[] shellSort(int[] arr){
20         //不断的减小增量 增量位incrementNum/2
21         for (int incrementNum = arr.length / 2 ; incrementNum > 0 ; incrementNum = incrementNum /2) {
22             for (int i = incrementNum; i < arr.length; i++) {
23                 //待插入的数
24                 int target = arr[i];
25                 //待插入数索引的前增量个数的增量
26                 int j = i - incrementNum;
27                 while (j >-1 && target < arr[j]){
28                     arr[j+incrementNum] = arr[j];
29                     j = j - incrementNum;
30                 }
31                 arr[j+incrementNum] = target;
32             }
33         }
34         return arr;
35     }
36 
37     public static void main(String[] args) {
38         int[] arr = new int[]{82 ,31 ,29 ,71, 72, 42, 64, 5,110};
39         System.out.println(Arrays.toString(shellSort(arr)));
40     }
41 }

猜你喜欢

转载自www.cnblogs.com/zsh-blogs/p/10387914.html