您的位置:首页 > 其它

浅析各类排序算法(五) 插入类排序之希尔排序

2017-11-26 17:41 429 查看

希尔排序(Shell Sort)

希尔排序(Shell Sort)是一种较诡异的排序算法,是一种插入排序的泛化,也称缩小增量排序。我们都知道直接插入排序在序列元素基本有序的情况下效率是很高的。基于此,希尔排序通过一个递减的间隙序列不断使原序列变得更加基本有序,从而降低了算法的时间复杂度。

希尔排序的一般步骤:

1.选取一个递减,最后元素为1的间隙序列。
2.循环间隙序列的每一个元素k,找出原序列对于k位置的剩余类[k, k + n, k + 2n.....];
3.对剩余类位置组成的元素序列进行直接插入排序。
4.循环k,直到k = 1结束。

排序过程图:





间隙序列的选取:

决定使用哪一种间隙序列的问题是困难的。现在实际应用中普遍使用的间隙序列为Tokuda的序列。即由简单公式定义 {\
displaystyle h_ {k} = \ lceil h'_ {k} \ rceil}

, {\
displaystyle h'_ {k} = 2.25h'_ {k-1} +1}

, {\
displaystyle h'_ {1} = 1}


时间复杂度:

取决于间隙序列的选取.平均复杂度大于在O(n^1.4)左右。中规模数据表现较好,对于大规模数据还是推荐快排。

空间复杂度:

O(1)

稳定性:

局部插入过程是稳定的,但整体是不稳定的。

代码:

//根据当前间隙序列中的元素dk排序
void ShellInsert(int arr[], int n, int dk) {
for(int i = dk + 1; i <= n; i++) {
if(arr[i] < arr[i - dk]) {
arr[0] = arr[i];
int j;
for(j = i - dk; j > 0 && arr[0] < arr[j]; j -= dk)
arr[j + dk] = arr[j];
arr[j + dk] = arr[0];
}
}
}
//希尔排序
void ShellSort(int arr[], int dk[], int numdk, int n) {
for(int i = 0; i < numdk; i++)
ShellInsert(arr, n, dk[i]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  希尔排序
相关文章推荐