目录
简介:
希尔排序属于插入类排序,是升级版的插入排序,是将整个有序序列分割成若干小的子序列分别进行插入排序。
算法思想:
-
首先初始化增量,根据把数组分成若干个小数组,然后对小数组做插入排序。
-
增量变为原先的一半,继续第一步。
-
继续第二步,直到增量为0。(增量为1就相当于整个数组做了插入排序)
例如,一个长度为32的乱序数组需要排序。
第一步先把它分成16组,每组2个整数,分别做插入排序。
第二步再把经过第一趟排序后的32个整数分成8组,每组4个整数,分别做插入排序。
第三步再把经过前两趟排序后的32个整数分成4组,每组8个整数,分别做插入排序。
第四步再把经过前三趟排序后的32个整数分成2组,每组16个整数,分别做插入排序。
第五步再把经过第一趟排序后的32个整数分成1组,每组32个整数,做插入排序。
代码实现:(Java)
public static void ChilleSort(int arr[]) {
//增量increment初始化为数组长度的一半
for (int increment = arr.length >> 1; increment > 0; increment /= 2) {
//根据increment分成一个个小组,做插入排序
for (int i = increment; i < arr.length; i++) {
// 将arr[i]插在正确的位置上
insert(arr, increment, i);
}
}
}
private static void insert(int[] arr, int increment, int i) {
for (; i >= increment; i -= increment) {
if (arr[i] < arr[i - increment]) {
//交换两个数据
swap(arr, i, i - increment);
} else
//找到了arr[i]的位置
break;
}
}
private static void swap(int[] arr, int i, int increment) {
int num = arr[i];
arr[i] = arr[increment];
arr[increment] = num;
}
时间复杂度:
最外层for循环需要执行次,第二层for循环需要执行(n-increment)次,最里层for循环最坏情况需要执行n次,最好的情况只需要执行一次,因此时间复杂度为
~
,平均时间复杂度大致是
。