算法思想:先比较距离远的元素,而不想简单交换排序算法那样先比较相邻的元素。这样可以快速减少大量的无序情况,从而减轻后续工作。被比较的元素之间的距离之间的距离逐步减少,直到减少为1,这时排序变成了相邻元素的互换。
Shell排序是比较排序,时间复杂度O(n^a),1<a<2,平均a约为1.3,空间复杂对O(1),非稳定排序。
Shell排序 | 比较排序 | O(n^a),1<a<2,平均a约为1.3 | O(1) | 非稳定排序 |
算法实现ShellSort.h
#include <iostream>
using namespace std;
template<class T>
void ShellSort(T a[],int n);
template<class T>
void Output(T a[],int n);
template<class T>
void ShellSort(T a[],int n)
{
int gap, i, j;
for (gap = (n+1)/2; gap > 0; gap /= 2)
{
for (i = gap; i < n; i++)
{
for (j = i-gap; j >= 0 && a[j] > a[j+gap]; j -= gap)
swap(a[j],a[j+gap]);
}
}
}
template<class T>
void Output(T a[],int n)
{
for (int i = 0; i < n; i++)
cout << a[i] <<" ";
cout << endl;
}
#include "ShellSort.h"
#define size(a) sizeof(a)/sizeof(a[0])
int main()
{
int a[] = {-5,-11,4,2,21,56,9,-11,9,333};
int n = size(a);
//int n = sizeof(a)/sizeof(a[0]);
cout << "排序之前:" << endl;
Output(a,n);
ShellSort(a,n);
cout << "排序之后:" << endl;
Output(a,n);
return 0;
}
结果: