zoukankan      html  css  js  c++  java
  • 用c实现shell排序

    shell排序的方法又称缩小增量法,是对直接插入排序法的改进。至于对于分组后采用哪种排序方法实现,本例采用直接选择排序和直接插入排序,理论上讲,通过分组排序后,数据基本上有序,这时通过直接插入排序会比直接选择排序好,因为直接选择排序每一趟排序都必须比较所有的元素。

    具体代码如下:

    /*
     *shell排序
    */
    
    #include <stdio.h>
    #define N 10
    
    void shellChoice(int *list)
    {
        int d=N/2,i,j,k,index;//d为增量
        int temp;
        while(d)  //最外层循环,用来确定步长的大小
        {
            for(i=0;i<d;i++)    //外层循环,用来确定要执行多少次直接选择排序
            {
                for(j=i;j<N;j=j+d)   //内层循环,分组后的排序,采用直接选择排序
                {
                    index=j;                          
                    for(k=j;k<N-d;k=k+d)
                    {
                        if(list[index]>list[k+d])
                        {
                            index=k+d;
                        }
                    }
                    if(j==index)
                        continue;
                    else
                    {
                        temp=list[j];
                        list[j]=list[index];
                        list[index]=temp;
                    }
                }
            }
            d=d/2;
        }
    }
    
    void shellInsert(int *list)
    {
            int d,i,j,index;//d为增量
            int temp;
            for(d=N/2;d>0;d=d/2)  //最外层循环,用来确定增量的多少
            {
                    for(i=0;i<d;i++)    //外层循环,用来确定要执行多少次直接插入排序
                    {
                            for(j=i;j<N;j=j+d)   //内层循环,分组后的排序,采用直接插入排序
                            {
                                    temp=list[j];
                                   index=j-d;
                                    while(temp<list[index] && index>=0)
                                    {
                                           list[index+d]=list[index]; 
                                           index=index-d; 
                                    }
                                    list[index+d]=temp;
                    
                            }
                    }
            }
    }
    
    void print(int *list)
    {
        int i=0;
        for(i=0;i<N;i++)
            printf("%d ",list[i]);
        printf("
    ");
    }
    
    int main(void)
    {
        int i=0;
        int a[N]={0};
        printf("请输入10个数
    ");
        for(i=0;i<N;i++)
            scanf("%d",&a[i]);
        printf("排序前
    ");
        print(a);
        shellInsert(a);
        printf("排序后
    ");
        print(a);
        return 0;
    }

     程序猿必读

  • 相关阅读:
    Yii数据库操作增删改查-[增加查询更新删除 AR模式]
    Yii2 关于时间格式的用法
    常用Linux命令
    数据库设计规范
    PHP代码规范
    git fetch 的简单用法:更新远程代码到本地仓库及冲突处理
    yii2 URL重写 nginx的配置
    Linux下免安装mysql
    在CentOS下搭建自己的Git服务器
    开源技术推荐之个人使用心得
  • 原文地址:https://www.cnblogs.com/longzhongren/p/4421692.html
Copyright © 2011-2022 走看看