开发者社区> 问答> 正文

数据结构课程设计:排序算法性能比较 编写程序在运行时产生1000个随机整数,分

数据结构课程设计:排序算法性能比较 编写程序在运行时产生1000个随机整数,分

展开
收起
知与谁同 2018-07-22 12:31:51 2256 0
1 条回答
写回答
取消 提交回答
  • #include<stdio.h>
    #include<stdlib.h>
    #include <math.h>
    #define L 8 //排序元素个数
    #define FALSE 0
    #define TRUE 1

    typedef struct
    {
    int key;
    char otherinfo;
    }RecType;

    typedef RecType Seqlist[L+1];
    int num; //定义排序趟数的全局变量
    Seqlist R;
    //直接插入排序
    void Insertsort()
    {
    int i,j,k,m=0;
    printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t");
    for(k=1;k<=L;k++)
    {
    printf("%5d",R[k].key);
    }
    getchar();
    printf("\n");
    for(i=2;i<=L;i++)
    {
    if(R[i].key<R[i-1].key)
    {
    R[0]=R[i];
    j=i-1;
    while(R[0].key<R[j].key)
    {
    R[j+1]=R[j];
    j--;
    }
    R[j+1]=R[0];
    }
    m++;
    printf("\t\t第%d趟排序结果为(按回车键继续):\n\t\t",m);
    for(k=1;k<=L;k++)
    {
    printf("%5d",R[k].key);
    }
    getchar();
    printf("\n");
    }
    printf("\n\t\t排序的最终结果是:\n\t\t");
    for(i=1;i<=L;i++)
    {
    printf("%5d",R[i].key);
    }
    printf("\n");
    }
    //希尔排序
    void Shellsort()
    {
    int i,j,gap,x,m=0,k;
    printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t");
    for(k=1;k<=L;k++)
    {
    printf("%5d",R[k].key);
    }
    getchar();
    printf("\n");
    gap=L/2;
    while(gap>0)
    {
    for(i=gap+1;i<=L;i++)
    {
    j=i-gap;
    while(j>0)
    {
    if(R[j].key>R[j+gap].key)
    {
    x=R[j].key;
    R[j].key=R[j+gap].key;
    R[j+gap].key=x;
    j=j-gap;
    }
    else
    {
    j=0;
    }
    }
    }
    gap=gap/2;
    m++;
    printf("\t\t第%d趟排序结果为(按回车键开始排序):\n\t\t",m);
    for(k=1;k<=L;k++)
    {
    printf("%5d",R[k].key);
    }
    getchar();
    printf("\n");
    }
    printf("\n\t\t排序的最终结果是:\n\t\t");
    for(i=1;i<=L;i++)
    {
    printf("%5d",R[i].key);
    }
    printf("\n");
    }
    //冒泡排序
    void Bubblesort()
    {
    int i,j,k;
    int exchange;
    printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t");
    for(k=1;k<=L;k++)
    {
    printf("%5d",R[k].key);
    }
    getchar();
    printf("\n");
    for(i=1;i<L;i++)
    {
    exchange=FALSE;
    for(j=L;j>=i+1;j--)
    {
    if(R[j].key<R[j-1].key)
    {
    R[0].key=R[j].key;
    R[j].key=R[j-1].key;
    R[j-1].key=R[0].key;
    exchange=TRUE;
    }
    }
    if(exchange)
    {
    printf("\t\t第%d趟排序结果为(按回车键开始排序):\n\t\t",i);
    for(k=1;k<=L;k++)
    {
    printf("%5d",R[k].key);
    }
    getchar();
    printf("\n");
    }
    }
    printf("\n\t\t排序的最终结果是:\n\t\t");
    for(i=1;i<=L;i++)
    {
    printf("%5d",R[i].key);
    }
    printf("\n");
    }

    int Partition(int i,int j) //i和j为形式参数,分别代表low和high
    {
    RecType pirot=R[i];
    while(i<j)
    {
    while(i<j&&R[j].key>=pirot.key)
    {
    j--;
    }
    if(i<j)
    {
    R[i++]=R[j];
    }
    while(i<j&&R[j].key<=pirot.key)
    {
    i++;
    }
    if(i<j)
    {
    R[j--]=R[i];
    }
    }
    R[i]=pirot;
    return i;
    }
    //递归形式为快速排序
    void Quicksort(int low,int high)
    {
    int pirotpos,k;
    if(low<high)
    {
    pirotpos=Partition(low,high);
    num++;
    printf("\t\t第%d趟排序结果为(按回车键开始排序):\n\t\t",num);
    for(k=1;k<=L;k++)
    {
    printf("%5d",R[k].key);
    }
    getchar();
    printf("\n");
    Quicksort(low,pirotpos-1);
    Quicksort(pirotpos+1,high);
    }
    }
    //选择排序
    void Selectsort()
    {
    int i,j,k,h;
    printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t");
    for(k=1;k<=L;k++)
    {
    printf("%5d",R[k].key);
    }
    getchar();
    printf("\n");
    for(i=1;i<L;i++)
    {
    h=i;
    for(j=i+1;j<=L;j++)
    {
    if(R[j].key<R[h].key)
    {
    h=j;
    }
    }
    if(h!=j)
    {
    R[0]=R[i];
    R[i]=R[h];
    R[h]=R[0];
    }
    printf("\t\t第%d趟排序结果为(按回车键开始排序):\n\t\t",i);
    for(k=1;k<=L;k++)
    {
    printf("%5d",R[k].key);
    }
    getchar();
    printf("\n");
    }
    printf("\n\t\t排序的最终结果是:\n\t\t");
    for(i=1;i<=L;i++)
    {
    printf("%5d",R[i].key);
    }
    printf("\n");
    }

    void Merge(int low,int mm,int high)
    {
    int i=low,j=mm+1,p=0;
    RecType *R1;
    R1=new RecType[high-low+1];
    if(!R1)
    {
    printf("内存容量不够。");
    }
    while(i<=mm&&j<=high)
    {
    R1[p++]=(R[i].key<=R[j].key)?R[i++]:R[j++];
    }
    while(i<=mm)
    {
    R1[p++]=R[i++];
    }
    while(j<=high)
    {
    R1[p++]=R[j++];
    }
    for(p=0,i=low;i<=high;p++,i++)
    {
    R[i]=R1[p];
    }
    }

    void MergePass(int length)
    {
    int i;
    for(i=1;i+2*length-1<=L;i=i+2*length)
    {
    Merge(i,i+length-1,i+2*length-1);
    }
    if(i+length-1<L)
    {
    Merge(i,i+length-1,L);
    }
    }
    //归并排序
    void Mergesort()
    {
    int length,k,m=0,i;
    printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t");
    for(k=1;k<=L;k++)
    {
    printf("%5d",R[k].key);
    }
    getchar();
    printf("\n");
    for(length=1;length<L;length*=2)
    {
    MergePass(length);
    m++;
    printf("\t\t第%d趟排序结果为(按回车键开始排序):\n\t\t",m);
    for(k=1;k<=L;k++)
    {
    printf("%5d",R[k].key);
    }
    getchar();
    printf("\n");
    }
    printf("\n\t\t排序的最终结果是:\n\t\t");
    for(i=1;i<=L;i++)
    {
    printf("%5d",R[i].key);
    }
    printf("\n");
    }
    //堆建
    void CreateHeap(int root,int index)
    {
    int j,temp,finish;
    j=2*root;
    temp=R[root].key;
    finish=0;
    while(j<=index&&finish==0)
    {
    if(j<index)
    {
    if(R[j].key<R[j+1].key)
    {
    j++;
    }
    }
    if(temp>=R[j].key)
    {
    finish=1;
    }
    else
    {
    R[j/2].key=R[j].key;
    j=j*2;
    }
    }
    R[j/2].key=temp;
    }//堆排序
    void Heapsort()
    {
    int i,j,temp,k;
    for(i=(L/2);i>=1;i--)
    {
    CreateHeap(i,L);
    }
    for(i=L-1,k=1;i>=1;i--,k++)
    {
    temp=R[i+1].key;
    R[i+1].key=R[1].key;
    R[1].key=temp;
    CreateHeap(1,i);
    printf("\t\t第%d趟排序结果为(按回车键开始排序):\n\t\t",k);
    for(j=1;j<=L;j++)
    {
    printf("%5d",R[j].key);
    }
    getchar();
    printf("\n");
    }
    }
    void Heap()
    {
    int i;
    printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t");
    for(i=1;i<=L;i++)
    {
    printf("%5d",R[i].key);
    }
    getchar();
    printf("\n");
    Heapsort();
    printf("\n\t\t排序的最终结果是:\n\t\t");
    for(i=1;i<=L;i++)
    {
    printf("%5d",R[i].key);
    }
    printf("\n");
    }

    main()
    {
    Seqlist S;
    int i,k;
    char ch1,ch2,q;
    printf("\n\t\t1000个随机数产生:\n\t\t");
    for(i=1;i<=1000;i++)
    {

    S[i].key = rand() % 999 + 1; //产生1-1000的随机数
    //printf("%d\n", number); // 去掉注释显示随机数的输出}
    printf("\n\t\t排序数据已经输入完毕。");
    ch1='y';
    while(ch1=='y'||ch1=='Y')
    {
    printf("\n");
    printf("\n\t\t 排 序 子 系 统 \n");
    printf("\n\t\t*******************************************\n");
    printf("\n\t\t* 1--------更新排序数据 *\n");
    printf("\n\t\t* 2--------直接插入排序 *\n");
    printf("\n\t\t* 3--------希 尔 排 序 *\n");
    printf("\n\t\t* 4--------冒 泡 排 序 *\n");
    printf("\n\t\t* 5--------快 速 排 序 *\n");
    printf("\n\t\t* 6--------选 择 排 序 *\n");
    printf("\n\t\t* 7--------归 并 排 序 *\n");
    printf("\n\t\t* 8--------堆 排 序 *\n");
    printf("\n\t\t* 0--------返 回 *\n");
    printf("\n\t\t*******************************************\n");
    printf("\n\t\t 请选择菜单号(0--8):");
    scanf("%c",&ch2);
    getchar();
    for(i=1;i<=L;i++)
    {
    R[i].key=S[i].key;
    }
    switch(ch2)
    {
    case '1':
    printf("\n\t\t请输入%d个待排序数据(按回车键分隔):\n\t\t",L);
    for(i=1;i<=L;i++)
    {
    scanf("%d",&S[i].key);
    getchar();
    printf("\t\t");
    }
    printf("\n\t\t排序数据已经输入完毕。");
    break;
    case '2':
    Insertsort();
    break;
    case '3':
    Shellsort();
    break;
    case '4':
    Bubblesort();
    break;
    case '5':
    printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t");
    for(k=1;k<=L;k++)
    {
    printf("%5d",R[k].key);
    }
    getchar();
    printf("\n");
    num=0;
    Quicksort(1,L);
    printf("\n\t\t排序的最终结果是:\n\t\t");
    for(k=1;k<=L;k++)
    {
    printf("%5d",R[k].key);
    }
    printf("\n");
    break;
    case '6':
    Selectsort();
    break;
    case '7':
    Mergesort();
    break;
    case '8':
    Heap();
    break;
    case '0':
    ch1='n';
    break;
    default:
    system("cls");
    printf("\n\t\t 对不起,您的输入有误,请重新输入。\n");
    break;
    }
    if(ch2!='0')
    {
    if(ch2=='2'||ch2=='3'||ch2=='4'||ch2=='5'||ch2=='6'||ch2=='7'||ch2=='8')
    {
    printf("\n\n\t\t排序输出完毕。");
    printf("\n\t\t按回车键返回。");
    q=getchar();
    if(q!='\xA')
    {
    getchar();
    ch1='n';
    }
    }
    }
    }
    }
    2019-07-17 22:50:37
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
【云栖精选7月刊】抛开晦涩的算法、模型,让我们来谈谈互联网架构 立即下载
聚星台—客户运营核心大数据 与算法技术 立即下载
Apache Flink 流式应用中状态的数据结构定义升级 立即下载