Shell排序严格来说是基于插入排序而来的,我们来看一下Shell排序的执行流程:
(1)将有n个元素的数组分成n/2个子序列,第1个数据和第n/2+1个数据为一对
(2)一次循环执行完成之后使得每一个序列对排好序,也就是说在原来的数组中比较大小交换位置
(3)然后再变为n/4个子序列,再次排序。不断的重复这个过程,直到排序完成
图解执行过程:
package com.shi.sort;
import java.util.Arrays;
/**
* Created by shifeifei on 2016/5/15.
* 希尔排序:其时间复杂度受序列的影响交大,最坏的情况是o(n2),好的情况在o(n1.3),所以说它是一种不稳定的排序算法
*/
public class ShellSort {
public static void main(String[] args) {
int[] a = {127, 118, 105, 101, 112, 100};
for (int r = a.length; r >= 1; r = r / 2) {//分解数组为多个序列
for (int i = r; i < a.length; i++) {//比较划分好的每一对数据,并交换位置
int t = a[i];
int j = i - r;
while (j >= 0 && t < a[j]) {
a[j + r] = a[j];
j = j - r;
}
a[j + r] = t;
}
}
System.out.println(Arrays.toString(a));
}
}