四、希尔排序
概述:希尔排序,也称递减增量排序算法,是插入算法的一种更高进的改进版本。但希尔排序是非稳定排序算法。
希尔排序是基于插入排序的一下两点性质而提出改进方法的;
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
但插入排序一般来说是抵消的,因为插入排序每次只能将数据移动一位;
希尔排序的基本思想是:湘江整个待排序的记录序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
1、算法步骤
选择一个增量序列t1,t2,......,tk,其中ti>tj,tk=1;
按增量序列个数k,对序列进行k趟排序
每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m的子序列,分别对各子表进行直接插入排序。仅增量因子为1时,整个序列作为一个表来处理,表长度几位整个序列的长度。
2、动画演示
3、代码实现
/**
* 希尔排序
*
* @param arr 数组
*/
public void xier_sort(int[] arr) {
int length = arr.length;
for (int step = length / 2; step >= 1; step /= 2) {
// 从step位置开始进行插入排序,直至完毕
for (int i = step; i < arr.length; i++) {
int instartVal = arr[i];
int j = i - step; // 有序区最后一个元素
while (j >= 0) {
if (arr[j] > instartVal) {
arr[j + step] = arr[j];
j -= step;
} else {
break;
}
}
arr[j + step] = instartVal;
}
}
}
4、时间复杂度
O(n^(2/3))
5、例题
力扣--912.排序数组https://leetcode.cn/problems/sort-an-array/ 题解
public int[] sortArray(int[] arr) {
int length = arr.length;
for (int step = length / 2; step >= 1; step /= 2) {
for (int i = step; i < arr.length; i++) {
int instartVal = arr[i];
int j = i - step;
while (j >= 0) {
if (arr[j] > instartVal) {
arr[j + step] = arr[j];
j -= step;
} else {
break;
}
}
arr[j + step] = instartVal;
}
}
return arr;
}