希尔排序(shellsort)算法实现

    希尔排序(shellsort)又叫增量递减(diminishing increment)排序,是由D.L. Shell发明的,这个算法是通过一个逐渐减小的增量使一个数组逐渐趋近于有序从而达到排序的目的。

      假设有一个数组int data[16] = {...}。 首先将这个增量设为16 / 2 = 8, 这样就将这个数组分成了8个子数组,它们的索引是0, 8    1, 9   2, 10等等 。对这些子数组进行排序。然后再使增量为8 / 2 = 4,这样就将原数组分成了4个子数组,它们的索引分别是0, 4, 8, 12    1, 5, 9, 13等等。再对这四组数进行排序,直到增量为1。
     以上所描述的增量递减只是一种方法,这种方法并不是最有效率的。如f(n) = 3 * f(n - 1) + 1  f(1) = 1   (..., 121, 40, 13,  4, 1)就比上面的取增量的方法好。这种方法的时间复杂度是O(n ^1.5)

算法如下

#include <stdio.h>

void output_array(int data[], int n)
{
    
int i;
    
for(i = 0; i < n; i++)
        printf(
"%d ", data[i]);
    printf(
"\n");
}
void swap(int *a, int *b)
{
    
int x;
    x 
= *a;
    
*= *b;
    
*= x;
}
void insertion_sort(int data[], int n, int increment)
{
    
int i, j;
    
for(i = increment; i < n; i += increment)
        
for(j = i; j >= increment && data[j] > data[j - increment]; j -= increment)
            swap(
&data[j], &data[j - increment]);
}
void shellsort(int data[], int n)
{
    
int i, j;
    
for(i = n / 2; i > 2; i /= 2)
        
for(j = 0; j < i; j++)
            insertion_sort(data 
+ j, n - j, i);
    insertion_sort(data, n, 
1);
}
int main()
{
    
int data[] = {5316657766441110986};
    output_array(data, 
12);
    shellsort(data, 
12);
    output_array(data, 
12);
    
return 0;
}

posted on 2008-05-15 22:01 银河使者 阅读(1411) 评论(1)  编辑  收藏 所属分类: algorithmC/C++

评论

# re: 希尔排序(shellsort)算法实现 2008-05-16 12:08 网上买书

这是最标准的算法  回复  更多评论   


标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
 
相关链接:
网站导航:




<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

导航

统计

公告

我的其他blog
http://nokiaguy.cnblogs.com

常用链接

留言簿(4)

我参与的团队

随笔分类(147)

随笔档案(67)

相册

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

60天内阅读排行