标题: 希尔排序(shellsort)算法实现
最新评论:[添加评论]
1. Angel Lucifer 2008-05-15 23:27
自从有了快速排序算法之后,Shell排序貌似已经绝迹了,呵呵。
2. 装配脑袋 2008-05-16 10:11
增量规则为k/2不是很好的选择,通过精心选取增量,希尔排序可以比严格N*Log(N)的堆排序更快(实际C#中测量,堆排序时间2000ms时同一组数据Sedgewick增量希尔排序可达800ms,但快速排序更快,为200ms)
3. 银河使者 2008-05-16 10:31
找到一个Sedgewick增量希尔排序的算法,现转之。哪位还有更高的方法请跟贴
希尔排序(Shell Sort)又叫做缩小增量排序(diminishing increment sort),是一种很优秀的排序法,算法本身不难理解,也很容易实现,而且它的速度很快。
插入排序(Insertion Sort)的一个重要的特点是,如果原始数据的大部分元素已经排序,那么插入排序的速度很快(因为需要移动的元素很少)。从这个事实我们可以想到,如果原始数据只有很少元素,那么排序的速度也很快。--希尔排序就是基于这两点对插入排序作出了改进。
例如,有100个整数需要排序。
1. 第一趟排序先把它分成50组,每组2个整数,分别排序。
2. 第二趟排序再把经过第一趟排序后的100个整数分成25组,每组4个整数,分别排序。
3. 第三趟排序再把前一次排序后的数分成12组,第组8个整数,分别排序。
4. 照这样子分下去,最后一趟分成100组,每组一个整数,这就相当于一次插入排序。
由于开始时每组只有很少整数,所以排序很快。之后每组含有的整数越来越多,但是由于这些数也越来越有序,所以排序速度也很快。
下面用C语言实现希尔排序,用的是K&R里的算法,该算法结构很清晰。
/* [K&R] p.62 section 3.5 */
void shellsort2(int V[], int n)
{
int gap, i, j, temp;
for (gap = n/2; gap > 0; gap /= 2)
for (i = gap; i < n; i++)
for (j = i-gap; j>=0 && V[j]>V[j+gap]; j -= gap) {
temp = V[j];
V[j] = V[j+gap];
V[j+gap] = temp;
}
}
由于嵌套了三个循环语句,逻辑上比较复杂,为了看清楚希尔排序的细节,我在这些循环中间加入一些 printf() 语句:
添加评论 | 返回随笔
返回顶部 | 返回首页