希尔排序是插入排序的改进,插入排序在序列基本有序时,非常的高效。插入排序是把序列的首个元素看做是有序的序列,然后把序列后面的元素往这个有序序列插入,其增量是1。而希尔排序则是取一定的增量的插入排序,其时间复杂度为nlogn。
例如:
5 4 3 2 1
第一趟取增量k=List.length/2,即对:5 3 1进行插入排序
排序后的序列为:1 4 3 2 5
第二趟取增量k/=2,上面的增量减半,再进行插入排序,直到增量为0,退出循环即可以得到有序序列。
参考代码:
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
const int c_n = 10;
void shellSort(int *a,int len)
{
int n = len / 2; //区间跨度
while (n)
{
for (int i = n; i < c_n; i += n)
{
int temp = a[i];
int j = i - n;
while (j >= 0 && temp < a[j])
{
a[j + n] = a[j];
j -= n;
}
a[j + n] = temp;
}
n /= 2;
}
}
void main()
{
int a[c_n];
srand(time(NULL));
for (int i = 0; i < c_n; i++)
{
a[i] = rand() % 10;
}
shellSort(a, c_n);
for (int i = 0; i < c_n; i++)
cout << a[i] << " ";
system("pause");
}