shell排序的快速掌握

        shell排序其实就是对直接插入排序的一个改进,当直接插入的数据很多的时候 就会造成效率很低 为了解决这个问题从而引入了shell排序

        什么是shell排序呢 简单来说就是将一堆大数据分割成若干个小数据 将每个小数据里面排序好从而就是将全部数据排列好了

        那究竟是如何进行分割分割的呢 首先我们先定义一个增量gap gap=length/2  然后将分割的两部分看成两组数据 依次递进比较对应数

                增量gap = gap/2  当gap等于1时就是该数据的最后一次比较顺序了  

附上代码:

//函数的参数包含两个,一个是要排序的数组,一个是数组的大小
//函数不使用额外的空间,只用到数组本身。这就要求数组在输入时候保留出
//R[0],R[0]就相当是一个temp。用于互换两个数时的一个临时数。
void shellsort(int R[],int n)
{
    int i,j,d;
    d = n/2;
    while(d >= 1)
    {
        //注意i的起始和最后的那个“=,我们的第一个数是R[1],所以i-d要从1开始
        for(i = d + 1;i <= n;i++)
        {
            j = i - d;
            //将R[i]暂存
            R[0] = R[i];
            //这边的R[0]就是R[j+d]也就是R[i]
            while(j>0 && R[j] > R[0])
            {
                //将j位置的值给j+d位置
                R[j+d] = R[j];
                j -= d;
            }
            //这边就是对应着上面的j-=d,如果上面的while执行了,j
            //位置的值已经给了j+d位置了,那么j+d的值也要给j位置,互换
            //这就要求下标必须是对应的。所以要将j-d才能满足这边是R[j]
            //如果while没有执行,那么还将原来的R[i]的值放到原来位置上
            R[j+d] = R[0];
        }
        //d减半
        d/=2;
    }
}



#include<stdio.h>

#define N 100
void shellsort(int *,int);

int main(void)
{
    int v[N];
    int n,i;

    printf("输入你数组的大小:");
    scanf("%d",&n);

    printf("输入%d个数,空格隔开:\n",n);
    for(i = 0;i < n; i++)
    {
        scanf("%d",&v[i]);
    }

    shellsort(v,n);

    printf("shell排序后:");
    for(i =0;i < n;i++)
    {
        printf("%3d",v[i]);
    }

    printf("\n");
    return 0;
}

void shellsort(int v[],int n)
{
    int i,j,temp,gap;

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值