目录
前言
前面我们学习了直接插入排序,而直接插入排序在数据逆序的时候,时间复杂度将达到O(N^2),这对于一个排序而言时间复杂度是很高的,因此今天我们将对直接插入排序进行优化,利用直接插入排序在数据越有序速度越快的特点来对其进行优化。
一、什么是希尔排序
希尔排序法又称缩小增量法。希尔排序法的基本思想是:把待排序文件中所有记录分成个组(具体这个分组是一个复杂的问题,这个随着数据而变的函数,是一个尚未解决的难题,到目前为止还没有一种很好的增量序列来解决,可以说这个增量序列可以有各种取法,但要注意的是应使增量序列中的值没有除1之外的公因子也就是尽量是素数,并且最后一个增量值必须取到1来结束这个整体的排序,前面的所有排序都是预排序,最后一次增量序列为1时才是真正的排序),所有距离为这个组数的记录分在同一组内,并对每一组内的记录进行排序。然后重复上述分组和排序的工作。当组数达到1时,将所有数据记录在统一组内排好序就可以完成对整体组数的排序。而具体排序方法还是利用直接插入排序来排的但是随着整个序列越来越有序的情况下速度也会越来越快,因此而言希尔排序就是对直接插入排序的优化。
二、具体代码实现
/**
* 其实就是一个直接插入排序
* @param array 待排序序列
* @param gap 组数
*/
public static void shell(int[] array,int gap) {
for (int i = gap + 1; i < array.length; i++) {
int j = i - gap;
int tmp = array[i];
for (; j >= 0; j -= gap) {
if(tmp < array[j]){
array[j + gap] = array[j];
}else{
break;
}
}
array[j + gap] = tmp;
}
}
public static void shellSort(int[] array) {
int gap = array.length;
while (gap > 1) {
shell(array,gap);//每次变换组数来排序
gap /= 2;
}
shell(array,1);//保证最后是1组
}
三、空间复杂度,时间复杂度和稳定性
时间复杂度:(和增量有关的)O(n ^ 1.3 - n ^ 1.5) 空间复杂度: O(1)(没有再使用其他变量) 稳定性:不稳定(如果排序过程中有跳跃式的变化就是不稳定的)
总结
希尔排序是对直接排序的优化,具体分组我们其实是可以随便来进行分的但是最后一定是按1来进行分配的,然后就是对整体的排序了,这样也是将插入排序进行了一些优化,但是希尔排序还是很少被使用的,但是一定要懂得这个是怎么来做的!