随机数以及希尔排序

希尔排序:简单地说,希尔排序就是进行多次的插入排序,次数由增量决定(又称缩小增量排序,最后增量减小到1)。适合元素多的情况。

        一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以希尔排序是不稳定的。

随机数:

要产生[m,n]范围内的随机数num,可用:

    int num=rand()%(n-m+1)+m;

    其中的rand()%(n-m+1)+m。

    或者说rand()%x+y所产生的随机数在[y,x+y-1]这个区间。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void shellsort(int b[],int count)
{
    int set[3]={5,2,1};//设置增量
    int i,j,getset,temp,j2;
    for(i=0;i<3;i++)
    {
        getset=set[i];//获取增量 

        for(j=getset;j<count;j++)  // 这种方式并不是先分组再插入排序
        {                       // 是一边分组一边插入排序,多组轮换插入排序         
            j2=j;

            for(;b[j2]<b[j2-getset]&&(j2-getset)>=0;j2=j2-getset)//元素在自己的组进行插入排序
            {
                temp=b[j2];
                b[j2]=b[j2-getset];
                b[j2-getset]=temp;
            }

        }
    /*  printf("--------shellsort--------\n");按增量查看插入排序是否正确
        for(int n=0;n<20;n++)
        {
            printf("%d\t",b[n]);
            if(n==9||n==19)printf("\n");
        }*/
    }
}

int main()
{
    int a[20],n;
    printf("产生20个随机数(范围为10到100):\n");
    //直接用rand()会产生伪随机数,编译一次多次输出结果一样
    srand((unsigned)time(NULL));//把当前时间设置为随机函数的种子,每次产生的数不一样
    for(n=0;n<20;n++)
    {
        a[n]=rand()%91+10;//随机数区间设置为-100到100
        printf("%d\t",a[n]);
        if(n==9||n==19)printf("\n");
    }
    shellsort(a,20);
    printf("--------after--shellsort--------\n");
    for(n=0;n<20;n++)
    {
        printf("%d\t",a[n]);
        if(n==9||n==19)printf("\n");
    }


}




猜你喜欢

转载自blog.csdn.net/IT8343/article/details/80794090