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 }