description
- 利用直接插入排序的特点:如果待排序的序列基本有序时或者元素数量较少时,效率大大提高,
- 希尔排序对序列进行“宏观”调整,先实现基本有序,然后再微观达到完全有序
- 基本思想
- 先取一个正整数 d1<n, 把所有相隔 d1 的记录放一组, 组内进行直接插入排序;
- 取 d2<d1, 重复上述分组和排序操作; 直至 di=1, 即所有记录放入一个组中进行排序为止
- 动画过程,来源于我的数据结构课程老师(刘庆晖老师)的课件
code
#include <iostream>
using namespace std;
int t = 0;
int* dlta = NULL;
int n = 13;
int num[] = {0, 23, 45, 17, 11, 13, 89, 72, 26, 3, 17, 11, 13};
void CreateDlta()
{
int tmp = n;
dlta = new int[tmp / 2];
while(tmp != 1) {
tmp /= 2;
dlta[t++] = tmp;
}
}
void ShellInsert(int dk)
{
int i, j = 0;
for(i = dk + 1; i < n; i++) {
num[0] = num[i];
for(j = i - dk; j > 0 && num[0] < num[j]; j -= dk)
num[j + dk] = num[j];
num[j + dk] = num[0];
}
}
void ShellSort()
{
for(int k = 0; k < t; k++) {
ShellInsert(dlta[k]);
}
}
int main()
{
CreateDlta();
ShellSort();
cout << "排序后的数组为:" << endl;
for(int i = 1; i < n; i++)
cout << num[i] << ' ';
cout << endl;
delete[] dlta;
return 0;
}
summary
- 希尔排序的时间复杂度和增量的选择有关,上述的最坏时间复杂度为O(n2)