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;
- }
阅读(862) | 评论(0) | 转发(1) |