DL.Shell于1959年提出“希尔排序”,它属于插入排序,对直接插入排序算法做出了很大的改进。
如何排序?
设无序序列有N个元素,先将这N个元素分成k组,每一组的间距为d,因为N不一定能整除d,所以实际上可能会有几个元素没有被分组,不过这没有关系,因为总有一次分组会将它们放到组内,因为我让间距d每一次都自减1,当然d最小只能为1,因为它只有N个元素。:)
希尔分析:(等实践完下面的代码,再看这段文字能更好地理解:))
希尔排序是按照不同步长对元素进行插入排序。当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。
/*
前言:但凡我的排序算法的案例,我都是采用统一的风格编写的,可以将他们整合到一起,进行比较,体验算法效率的差异性。
摘要:采用插入排序,对{0, 11, 12, 5,6, 13, 8, 9, 14, 7, 10}进行排序
完成日期:2012-7-13
作者:XX
版本:1.1v
*/
#include <stdio.h>
void PrintList(int a[], int n);
void ShellSort(int a[], int n);
int main()
{
int a[] = {0, 11, 12, 5, 6, 13, 8, 9, 14, 7, 10};
int n = 11;
printf("原序列:\n");
PrintList(a, n);
ShellSort(a, n);
printf("希尔排序后:\n");
PrintList(a, n);
return 0;
}
void ShellSort(int a[], int n)
{
int d = n/2;//分组间距的初始值
int i = 0;
int temp = 0;
for(d= n/2; d > 0; d--)
{
for(i = 0; i + d < n; i++)
{
if (a[i] > a[i + d]) //第i个元素大于第i + d个,则交换
{
temp = a[i];
a[i] = a[i + d];
a[i + d] = temp;
}
}
}
}
/*
功能:输出数组
输入:int list[], int n
输出:无
函数调用:无
*/
void PrintList(int list[], int n)
{
int i;
for (i = 0; i < n; i++)
{
printf("%4d", list[i]);
}
printf("\n");
}