c语言 插入排序(直接插入排序&希尔排序)&生成随机数

插入排序
使用数组或链表结构。用随机函数生成 100 个整数(1~1000),分别进行直接插入排序和希尔排序(增量序列 8,4,2,1)。
重复上述实验 1,000 次,

(1)计算 1,000 次实验所得到的平均比较次数
(2)对上述两种算法的时间效率进行比较分析

比较次数验证:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100
typedef struct{
    int R[N];      //用数组存储随机数
    int length;     //表长
}SSTable;

int InsertSort(SSTable *L)
{//直接插入排序
    int i,j,k=0;
    for(i=2;i<=N;++i)      //从第二个位置开始查找插入
    {
        k++;
        if(L->R[i]<L->R[i-1])    //若后一个数小于前一个数
        {
            L->R[0]=L->R[i];      //复制第i位为哨兵到第零位
            for(j=i-1;L->R[0]<L->R[j];--j,k++)
                L->R[j+1]=L->R[j];    //后移
            L->R[j+1]=L->R[0];     //插入到正确位置
        }
    }
    return k;
}

int ShellInsert (SSTable *L,int dk)
{//希尔排序II
    int i,j,k=0;
    for(i=dk+1;i<=N;i++)
    {
        k++;
        if(L->R[i]<L->R[i-dk])    //若后一个数小于前一个数
        {
            L->R[0]=L->R[i];      //复制第i位为哨兵到第零位
            for(j=i-dk;j>0&&(L->R[0]<L->R[j]);j=j-dk,k++)
                L->R[j+dk]=L->R[j];    //后移
            L->R[j+dk]=L->R[0];     //插入到正确位置
        }
    }
    return k;
}


int ShellSort(SSTable *L,int dlta[],int t)
{//希尔排序I
    int i=0,j;
    for(int k=0;k<t;k++)
    {
        j=ShellInsert(L,dlta[k]);
        i=i+j;
    }
    return i;
}


int main()
{
    srand(time(NULL));
    
    //直接插入排序
    int average=0,sum;
    int i,k,j;
    for(k=0;k<1000;k++)
    {
        printf("%d start:",k+1);
        SSTable L;
        for(i=1;i<=N;i++)//对L赋值
            L.R[i]=rand()%(1000)+1;   //生成1~1000的随机数并存入数组中
        sum=InsertSort(&L);             //直接插入排序
        average=average+sum;
        printf("\nSingle comparison times %d\n",sum);//单次比较次数
        printf("InsertSort:");
        for(j=1;j<=100;j++)
            printf("%d ",L.R[j]);
        printf("\n\n");
    }
    printf("\nInsertSort average:%d\n",average/1000);
 
    //希尔排序
    /*int average=0,sum;
    int i,k,j;
    for(k=0;k<1000;k++)
    {
        printf("%d start:",k+1);
        SSTable P;
        int dlta[4]={8,4,2,1};
        for(i=1;i<=N;i++)//对L赋值
            P.R[i]=rand()%(1000)+1;   //生成1~1000的随机数并存入数组中
        sum=ShellSort(&P,dlta,4);        //希尔排序
        average=average+sum;
        printf("\nSingle comparison times %d\n",sum);//单次比较次数
        printf("ShellSort:");
        for(j=1;j<=100;j++)
            printf("%d ",P.R[j]);
        printf("\n\n");
    }
    printf("\nShellSort average:%d\n",average/1000);*/
    
}

时间效率验算:

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

void InsertSort(int L[])
{//直接插入排序
    int i,j,k=0;
    for(i=2;i<=100000;++i)      //从第二个位置开始查找插入
    {
        if(L[i]<L[i-1])    //若后一个数小于前一个数
        {
            L[0]=L[i];      //复制第i位为哨兵到第零位
            for(j=i-1;L[0]<L[j];--j)
                L[j+1]=L[j];    //后移
            L[j+1]=L[0];     //插入到正确位置
        }
    }
}

void ShellInsert (int L[],int dk)
{//希尔排序II
    int i,j,k=0;
    for(i=dk+1;i<=100000;i++)
    {
        if(L[i]<L[i-dk])    //若后一个数小于前一个数
        {
            L[0]=L[i];      //复制第i位为哨兵到第零位
            for(j=i-dk;j>0&&(L[0]<L[j]);j=j-dk)
                L[j+dk]=L[j];    //后移
            L[j+dk]=L[0];     //插入到正确位置
        }
    }
}


void ShellSort(int L[],int dlta[],int t)
{//希尔排序I
    int i=0,j;
    for(int k=0;k<t;k++)
        ShellInsert(L,dlta[k]);
}


/* int main()
{
    srand(time(NULL));
    int a[100000];      //排列一万个数
    int dlta[4]={8,4,2,1};
    int k,i,j;
    for(i=1;i<=100000;i++)//对L赋值
        a[i]=rand()%(1000)+1;   //生成1~1000的随机数并存入数组中
    ShellSort(a,dlta,4);
    printf("Time used = %.2lf\n", (double)clock() / CLOCKS_PER_SEC);   //整个程序运行的时间 单位毫秒
}
 */

int main()
{//直接插入排序时间效率
    srand(time(NULL));
    int a[100000];      //排列一万个数
    int k,i,j;
    for(i=1;i<=100000;i++)//对L赋值
        a[i]=rand()%(1000)+1;   //生成1~1000的随机数并存入数组中
    InsertSort(a);
    printf("Time used = %.2lf\n", (double)clock() / CLOCKS_PER_SEC);   //程序运行的时间 单位毫秒
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值