希尔排序属于不稳定排序算法,仅可适用于顺序表,不适用于链表。
希尔排序基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2 =1( …。总之,记住先局部插入排序,逐步整体插入排序。
时间复杂度:最好 O(n1.3)、最坏 O(n2)
空间复杂度:O(1)
C++代码实现:
#include<iostream>
using namespace std;
/**
2.希尔排序
**/
// 自定义增量d=n/l
void ShellSort(int a[], int n, int l=2);
int main() {
int a[]={1,9,6,2,3,8};
int n=6;
ShellSort(a, n);
for(int i=0;i<n;i++) {
cout << a[i];
}
}
void ShellSort(int a[], int n, int l) {
int d,i,j;
for(d=n/l;d>=1;d=d/l)
for(i=d;i<n;i++)
if(a[i]<a[i-d]) {
int temp=a[i];
for(j=i-d;j>=0&&a[j]>temp;j-=d) {
a[j+d]=a[j];
a[j]=temp;
}
}
}
往期回顾: