希尔排序也称为“缩小增量排序”,基本原理是:首先将待排序的元素分为多个子序列,使得每个子序的元素个数相对较少,对各个子序分别进行直接插入排序,待整个待排序序列“基本有序后”,再对所有元素进行一次直接插入排序。
具体步骤如下:
(1)选择一个步长序列t1, t2, ..., tk,满足ti > tj(i <j),tk = 1。
(2)按步长序列个数k,对待排序序列进行k趟排序。
(3)每趟排序,根据对应的步长ti,将待排序的序列分割成ti个子序列,分别对各个子序列进行直接插入排序。
希尔排序的特点:
时间复杂度:希尔排序的时间复杂性在O(nlog2n)和O(n2 )之间,大致为O(n1.3)。
稳 定 性:不稳定
代码
#include <stdio.h>
void ShellSort(int arr[], int len)
{
int i, j, tmp, gap;
for(gap = len / 2 ; gap > 0; gap /= 2)
{
for(i = gap; i < len; i++)
{
tmp = arr[i];
for(j = i - gap; j >= 0 && arr[j] > tmp; j -= gap)
{
arr[j+gap] = arr[j]
}
arr[j+gap] = tmp;
}
}
}
int main()
{
int i, length;
int a[] = {3, 7, 17, 2, 5, 21, 19, 40, 9, 4};
length = sizeof(a) / sizeof(a[0]);
ShellSort(a, length);
for(i = 0; i < length ; i++)
{
printf("%d ", a[i]);
}
return 0;
}