算法描述
希尔排序是基于插入排序的思想,又被称为缩小增量排序。把数组按一定增量d分组,对每组记录采用直接插入排序方法进行排序,随着增量逐渐减小,所分成的组包含的记录越来越多,到增量的值减小到1时,整个数据合成一组有序的序列。
算法执行过程
1.将有n个元素的数组分成n/2个数字序列,第1个数据和第n/2+1个数据为一组,第2个数据和第n/2+2个数据为一组…
2.一次循环使每一组序列排好顺序。
3.将n个元素的数组分为n/4个数字序列,再次排序。
4.不断重复,当序列变为一组时,完成排序。
C++代码
#include <iostream>
using namespace std;
#define SIZE 10
void shellSort(int arr[], int len)
{
int i, j, h, r, temp;
int x = 0;
cout << "排序之前数组序列为: ";
for (i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl<<endl<<endl;
for (r = len / 2; r >= 1; r /= 2)
{
for (i = r; i < len; i++)
{
temp = arr[i];
j = i - r;
while (j >= 0 && temp < arr[j])
{
arr[j + r] = arr[j];
j -= r;
}
arr[j + r] = temp;
}
x++;
cout << "第" << x << "步的排序结果: ";
for (h = 0; h < len; h++)
{
cout << arr[h] << " ";
}
cout << endl<<endl<<endl;
}
cout << "最终的序列为: ";
for (h = 0; h < len; h++)
{
cout << arr[h] << " ";
}
cout << endl;
}
int main()
{
int arr[SIZE] = { 4,6,2,8,1,2,9,7,3,5 };
shellSort(arr, SIZE);
system("pause");
return 0x0;
}
执行过程
算法性能分析
平均时间复杂度 | 最坏情况 | 最好情况 | 空间复杂度 | 稳定性 |
---|---|---|---|---|
O(n㏒₂ⁿ) | O(n㏒₂ⁿ) | O(1) | 不稳定 |
参考
Algorithms (Fourth Edition) [美] Robert Sedgewick