简介
希尔排序(Shell’s Sort)是插入排序的一种又称”缩小增量排序“(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。
- 希尔排序的思想
- 因为真的确定不了增量,所以可以使用
while(true)
这种方式。break
条件是增量为1。 - 按增量分组进行比较,随着增量的缩小。每组包含的元素越来越多,到最后增量为1就只有一组数据。
- 因为真的确定不了增量,所以可以使用
核心代码
/**
* 希尔排序
*
* @param a
*/
public static int[] shellSort(int[] arr) {
int d = arr.length / 2;
while (true) {
for (int i = 0; i < d; i++) {
for (int j = i; j+d < arr.length; j += d) {
if (arr[j] > arr[j+d]) {
int temp = arr[j];
arr[j] = arr[j+d];
arr[j+d] = temp;
}
}
}
if (d == 1) {
break;
}
d--;
}
return arr;
}
- 每次循环
left
都从0开始,right
从i-1
开始。没什么问题。 - 只有当
left <= right
时,才计算mid
。while
循环为了确定插入位置。 - 第2个
for
循环为了后移元素,留出空位。 - 最后直接插入数据。
优缺点
优点
- 相比较另外两种插入排序,提高了效率。
- 减少了其复制的次数,速度要快很多。但没有快速排序快。
缺点
- 不稳定。增量的取值是多少,应该取多少个不同的值,都无法确切知道。只能凭经验来。
复杂度
时间复杂度
O(n^2)
空间复杂度
O(1)
稳定度
- 不稳定
- 由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以
shell
排序是不稳定的。
应用场景
- 专家们提倡,几乎任何排序工作在开始时都可以用希尔排序。若在实际使用中证明它不够快,再改成快速排序这样更高级的排序算法.