希尔排序原理:本质是插入排序,多趟插入排序。当序列几乎有序时,插入排序的时间复杂度接近O(n),希尔排序正是利用这一点。
时间复杂度:O(n2)。使用希尔增量的最坏时间是O(n2),还有一些增量可以降低时间复杂度。
总结:利用一些小技巧,可以使得效率提高。
算法较简单,代码如下:
#include <stdio.h>
#include <conio.h>
//函数原型
void shell_sort(int A[],int n);
int main()
{
int test[]={10,9,8,7,6,5,4,3,2,1};
shell_sort(test,10);
for(int i=0;i<10;i++)
printf("%d ",test[i]);
getch();
}
//希尔排序(使用希尔增量)-----初始版本
//void shell_sort(int A[],int n)
//{
// int temp=0;
// int i,j,k;
// for(int increment=n/2;increment>0;increment/=2)
// {
// for(i=0;i<increment;i++)
// {
// for(j=i+increment;j<n;j+=increment)
// {
// temp=A[j];
// for(k=j;k>=0 && A[k-increment]>temp;k-=increment)
// A[k]=A[k-increment];
// A[k]=temp;
// }
// }
// }
//}
//希尔排序(使用希尔增量) ----优化版本
void shell_sort(int A[],int n)
{
int temp=0;
int i,j,k;
for(int increment=n/2;increment>0;increment/=2)
{
for(i=increment;i<n;i++)//一个小技巧使得优化版本比初始版本少一重循环
{
temp=A[i];
for(j=i;j>=increment && A[j-increment]>temp;j-=increment)
A[j]=A[j-increment];
A[j]=temp;
}
}
}
相关文章:快速排序的随机化版本 快速排序的优化算法 归并排序的递归算法