用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;
}

 程序猿必读

原文地址:https://www.cnblogs.com/longzhongren/p/4421692.html