希尔排序
算法描述:
希尔排序也叫“缩小增量排序”,是由shell创立,也是插入排序的一种变异。每次设置一定的步长,一般设置delta=Array.length/2,从0开始,组成[0,0+delta,0+delta+delta,...],[1,1+delta,1+delta+delta,...]等子序列,每组子序列进行插入排序,知道最后delta=1,完成一次插入排序即完成最终排序。
例如:假如有初始数据:25 11 45 26 12 78。
1、第一轮排序,将该数组分成 6/2=3 个数组序列,第1个数据和第4个数据为一对,第2个数据和第5个数据为一对,第3个数据和第6个数据为一对,每对数据进行比较排序,排序后顺序为:[25, 11, 45, 26, 12, 78]。
2、第二轮排序 ,将上轮排序后的数组分成6/4=1个数组序列,此时逐个对数据比较,按照插入排序对该数组进行排序,排序后的顺序为:[11, 12, 25, 26, 45, 78]。
时间复杂度:最好的情况为O(n*lgn),最差复杂度O(n*n)
空间复杂度:O(1)
java实现:
public static void shellSort(int[] arr) {
int delta = arr.length / 2; // 每一步步长为数组长度除以2,也有按其他步长的
while (delta >= 1) {
for (int i = 0; i < delta; i++) {// 每组起始位置
for (int j = i + delta; j < arr.length; j += delta) {// 以下代码是插入排序的代码
int target = arr[j];
int k = j;
while (k > 0 && arr[k - delta] > target) {
arr[k] = arr[k - delta];
k -= delta;
}
arr[k] = target;
}
}
delta = delta / 2; // 每次除以2,最终到步长为1终止
}
}
github地址:https://github.com/xckNull/Algorithms-introduction.git