shell排序是一种比较高效的排序算法,虽然理论上不是NlogN的算法复杂度。但是不影响shell的速度。
快速排序quicksort存在两个问题,一个是递归实现,有可能栈溢出。第二个问题是,快速排序在极端情况下,算法复杂度有可能退化成(N^2)。
如果不确定使用快速排序是否正确的场合,使用shell排序是个不错的选择,因为shell排序,不需要对输入的数据进行太多的分析调查。
shell排序的算法复杂度,与shellsort中的步长有很大的关系。选择一个好的步长对shellsort很关键。shellsort的始祖Shell提出算法时给出的步长序列是 (2^n), 后续的研究证明是很烂的一个步长序列。
简单的步长序列有:
1) 3*n+1 即(1,4,13,40,121,364,1093,3280……) 算法复杂度低于O(N^1.5)
2) 4^(i+1) + 3*2^(i) + 1 即(1,8,23,77,281,1073,4193……) 算法复杂度低于O(N^(4/3))
OK,理论部分到此结束,下面给出代码。
- #include<stdio.h>
-
#include<stdlib.h>
-
#include<time.h>
-
-
void shellsort(int array[],int l,int r)
-
{
-
int i,j,hop;
-
int curitem;
-
for( hop = 1;hop <= (r-l)/9;hop=3*hop+1)
-
;
-
-
for(;hop>0;hop/=3)
-
{
-
for(i = l+hop;i <= r ; i++)
-
{
-
j = i;
-
curitem= array[i];
-
while( (j>=(l+hop)) && curitem < array[j-hop])
-
{
-
array[j] = array[j-hop];
-
j = j-hop;
-
}
-
array[j] = curitem;
-
}
-
}
-
}
-
-
-
int test_shellsort()
-
{
-
int i;
-
int number = 50;
-
-
int *array = malloc(number*sizeof(int));
-
if(array == NULL)
-
{
-
printf("malloc failed\n");
-
return -1;
-
}
-
-
-
printf("----------------------------------------before shell sort--------------\n");
- srand(time(NULL));
-
for(i = 0;i<number;i++)
-
{
-
array[i] = rand()%10000;
-
printf("\tarray[%6d] = %6d\n",i,array[i]);
-
}
-
-
printf("----------------------------------------after shell sort-----------------\n");
-
-
shellsort(array,0,number-1);
-
for(i = 0;i<number;i++)
-
{
-
printf("\tarray[%6d] = %6d\n",i,array[i]);
-
}
- free(array);
-
return 0;
-
-
}
-
int main()
-
{
-
test_shellsort();
- return 0;
-
}
阅读(2816) | 评论(0) | 转发(2) |