希尔排序
- 希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。
- 希尔排序是基于插入排序的以下两点性质而提出改进方法的:
- 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
- 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
- 希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录 “基本有序” 时,再对全体记录进行依次直接插入排序。
即: 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。
排序动态变化过程
排序java语言实现
public static void shellerSort(int[] array) {
//临时变量储存交换值
int temp;
//定义储存初始增量
int incremental;
//控制分组间隔,一般为初始增量为数组长度的一半
for (incremental =(array.length)/2 ; incremental>=1; incremental/=2) {
System.out.print("数组:"+Arrays.toString(array)+"---增量为:"+incremental+"---");
//控制小组首位索引
for (int x = 0; x < incremental; x++) {
//对每一个小组进行组内 插入排序
for(int y=x;y< array.length-incremental;y+=incremental) {
for (int j = y+incremental; j >incremental-1; j -= incremental) {
if (array[j] < array[j - incremental]) {
temp = array[j];
array[j] = array[j - incremental];
array[j - incremental] = temp;
}else{
break;
}
}
}
}
System.out.println(Arrays.toString(array));
}
}
排序结果
算法分析
时间复杂度
希尔排序的时间的时间复杂度为O(
),希尔排序时间复杂度的下界是n*log2n。
稳定性
由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。
参考百度百科:希尔排序