介绍
希尔排序(Shell’s Sort)又称为“缩小增量排序”(Diminishing Increment Sort),是对直接插入排序的改进版本。是一个非稳定的排序算法。时间复杂度为O(n1.3)~O(n2)。
算法的时间复杂度对比:
主要对插入排序作出以下改进:
- 插入排序对近乎有序的数据效率非常高,可达到O(n)的时间复杂度。
- 插入排序每次只移动一个位置,是低效的。
思路
- 设定一个增量gap,初始化
gap=n/2
,完成一趟插入后,gap /= 2
。 - 进行插入排序,只是每次不是与前一个元素比较是与前gap个元素比较
实现代码
以升序为例
#include<bits/stdc++.h>
using namespace std;
template<typename T>
void shellSort(T arr[], int n) {
for(int gap = n/2; gap > 0; gap /= 2) {
for(int i = gap; i < n; i++) {
int j;
T temp = arr[i];
for(j = i; j >= gap && arr[j-gap] > temp; j -= gap) {
arr[j] = arr[j-gap];
}
arr[j] = temp;
}
}
return;
}
int main(int argc, char const *argv[])
{
// 测试
int arr[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
shellSort(arr, 10);
for(int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
return 0;
}
最后
- 由于博主水平有限,难免有疏漏之处,欢迎读者批评指正!