永发信息网

数据结构排序算法(C描述)

答案:1  悬赏:50  手机版
解决时间 2021-05-07 05:10
谁有数据结构的整套排序算法帮忙写出以下C实现代码
  • (1)冒泡排序;
  • (2)选择排序;
  • (3)插入排序;
  • (4)快速排序;
  • (5)堆排序;
  • (6)归并排序;
  • 最佳答案

    看看可以不


    #include<stdio.h>


    #include<stdlib.h>



    #define TRUE 1


    #define FALSE 0


    #define OK 1


    #define ERROR


    #define OVERFLOW -2


    #define MAXSIZE 20 //一个用作示例的小顺序表的最大长度


    #define LT(a,b) ((a)<(b))


    #define LQ(a,b) ((a)<=(b))



    typedef int KeyType;//定义关键字类型为整数类型


    typedef int InfoType;


    typedef struct


    {


    KeyType key;//关键字项


    InfoType otherinfo;//其他数据项


    }RedType;//记录类型


    typedef struct


    {


    RedType r[MAXSIZE+1];//r[0]闲置或用作哨兵单元


    int length;//顺序表长度


    }SqList;//顺序表类型



    int InitList_Sq(SqList &L)


    {//构造一个空的顺序表L。


    int i;


    printf("请输入待排序的记录的个数:");


    scanf("%d",&L.length);


    printf("请输入待排序的记录的关键字(整型数):");


    for(i=1;i<=L.length;i++)


    scanf("%d",&L.r[i]);


    return OK;


    }



    void Print_Sq(SqList &L) //输出


    {


    int i;


    for(i=1;i<=L.length;i++)


    {


    printf("%4d",L.r[i]);


    }


    printf("\n");


    }



    //------------插入排序---


    void InsertSort(SqList &L)


    {//对顺序表L作直接插入排序。


    int i,j;


    for(i=2;i<=L.length;++i)


    if(LT(L.r[i].key,L.r[i-1].key))//“<”,需将L.r[i]插入有序子表


    {


    L.r[0]=L.r[i];//复制为哨兵


    L.r[i]=L.r[i-1];


    for(j=i-2;LT(L.r[0].key,L.r[j].key);--j)


    L.r[j+1]=L.r[j];//记录后移


    L.r[j+1]=L.r[0];//插入到正确位置


    }


    }


    //--------------冒泡排序---


    void BubbleSort(SqList &L)


    {//L.r是待排序的文件,采用自下向上扫描,对L.r做冒泡排序


    int i,j;


    int exchange; // 交换标志


    for(i=1;i<L.length;i++)


    {// 最多做 n-1 趟排序


    exchange=FALSE; // 本趟排序开始前,交换标志应为假


    for(j=L.length-1;j>=i;j--) // 对当前无序区 R[i..n] 自下向上扫描


    if(LT(L.r[j+1].key,L.r[j].key))


    { // 交换记录


    L.r[0]=L.r[j+1]; //L.r[0]不是哨兵,仅做暂存单元


    L.r[j+1]=L.r[j];


    L.r[j]=L.r[0];


    exchange=TRUE; // 发生了交换,故将交换标志置为真


    }


    if(!exchange) // 本趟排序未发生交换,提前终止算法


    return;


    }


    }


    //-----------快速排序---


    int Partition(SqList &L,int low,int high)


    {//交换顺序表L中子表r[low..high]的记录,枢轴记录到位,并返回其所在位置,此时


    //在它之前(后)的记录均不大(小)于它。


    KeyType pivotkey;


    L.r[0]=L.r[low];//用子表的第一个记录作枢轴记录


    pivotkey=L.r[low].key;//枢轴记录关键字


    while(low<high)


    {//从表的两端交替地向中间扫描


    while (low<high&&L.r[high].key>=pivotkey) --high;


    L.r[low]=L.r[high];//将比枢轴记录小的记录移到低端


    while (low<high&&L.r[low].key<=pivotkey) ++low;


    L.r[high]=L.r[low];//将比枢轴记录大的记录移到高端


    }


    L.r[low]=L.r[0];//枢轴记录到位


    return low;//返回枢轴位置


    }



    void QSort(SqList &L,int low,int high)


    {//对顺序表L中的子序列L.r[low..high]进行快速排序


    int pivotloc;


    if(low<high)


    {//长度大于1


    pivotloc=Partition(L,low,high);//将L.r[low..high]一分为二


    QSort(L,low,pivotloc-1);//对低子表递归排序pivotloc是枢轴位置


    QSort(L,pivotloc+1,high);//对高子表递归排序


    }


    }



    void QuickSort(SqList &L)


    {//对顺序表L作快速排序。


    QSort(L,1,L.length);


    }


    //----------归并排序---


    void Merge(RedType SR[],RedType TR[],int i,int m,int n)


    {//将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]


    int j,k;


    for(j=m+1,k=i;i<=m&&j<=n;++k)


    {//将SR中记录由小到大地并入TR


    if LQ(SR[i].key,SR[j].key) TR[k]=SR[i++];


    else TR[k]=SR[j++];


    }


    if(i<=m)//TR[k..n]=SR[i..m];将剩余的SR[i..m]复制到TR


    while(k<=n&&i<=m) TR[k++]=SR[i++];


    if(j<=n)//将剩余的SR[j..n]复制到TR


    while(k<=n&&j<=n) TR[k++]=SR[j++];


    }



    void MSort(RedType SR[],RedType TR1[],int s,int t)


    {//将SR[s..t]归并排序为TR1[s..t]。


    int m;


    RedType TR2[20];


    if(s==t) TR1[t] = SR[s];


    else


    {


    m=(s+t)/2;//将SR[s..t]平分为SR[s..m]和SR[m+1..t]


    MSort(SR,TR2,s,m);//递归地将SR[s..m]归并为有序的TR2[s..m]


    MSort(SR,TR2,m+1,t);//将SR[m+1..t]归并为有序的TR2[m+1..t]


    Merge(TR2,TR1,s,m,t);//将TR2[s..m]和TR2[m+1..t]归并到TR1[s..t]


    }


    }



    void MergeSort(SqList &L)


    {// 对顺序表L作归并排序。


    MSort(L.r, L.r, 1, L.length);


    }


    //-----------堆排序---


    void HeapAdjust(SqList &H,int s,int m)


    {//已知H.r[s..m]中记录的关键字除H.r[s].key之外均满足堆的定义,


    //本函数调整H.r[s]的关键字,使H.r[s..m]成为一个大顶堆


    //(对其中记录的关键字而言)


    int j;


    RedType rc;


    rc=H.r[s];


    for(j=2*s;j<=m;j*=2)


    {//沿key较大的孩子结点向下筛选


    if(j<m&&H.r[j].key<H.r[j+1].key) ++j;//j为key较大的记录的下标


    if(rc.key>=H.r[j].key) break;//rc应插入在位置s上


    H.r[s]=H.r[j];


    s=j;


    }


    H.r[s]=rc;//插入


    }



    void HeapSort(SqList &H)


    {//对顺序表H进行堆排序。


    int i;


    RedType temp;


    for(i=H.length/2;i>0;--i)//把H.r[1..H.length]建成大顶堆


    HeapAdjust(H,i,H.length);


    for(i=H.length;i>1;--i)


    {


    temp=H.r[i];


    H.r[i]=H.r[1];


    H.r[1]=temp;//将堆顶记录和当前未经排序子序列Hr[1..i]中


    //最后一个记录相互交换


    HeapAdjust(H,1,i-1);//将H.r[1..i-1]重新调整为大顶堆


    }


    }



    void main()


    {


    SqList S;


    printf("---------- 五种排序算法 ----------\n");


    InitList_Sq(S);


    printf(" 1.简单插入排序\n");


    InsertSort(S);


    Print_Sq(S);


    printf(" 2.冒泡排序\n");


    BubbleSort(S);


    Print_Sq(S);


    printf(" 3.快速排序\n");


    QuickSort(S);


    Print_Sq(S);


    printf(" 4.归并排序\n");


    MergeSort(S);


    Print_Sq(S);


    printf(" 5.堆排序\n");


    HeapSort(S);


    Print_Sq(S);

    }
    我要举报
    如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
    大家都在看
    贝贝轩母婴生活馆地址在哪,我要去那里办事
    一般问生日是指农历还是新历?
    吸血鬼日记电子书下载
    谁有QQ宠物宠爱的密匙
    Cf怎么样跳的更高啊!比如说:运输船的那个箱
    警官学院到香格里拉小学,卫岗小学北区,合肥
    感情专一,,什么意思
    考研专业课 农业知识综合3(食品加工与安全)
    《海派甜心》第五集收视率是多少
    QQ农场怎么一直是这样啊?进不去了
    美兰区人才劳动力市场我想知道这个在什么地方
    梦幻诸仙里的各个门派加点法..
    为什么我耍冰封王座会时不时的卡屏
    空间触图可以帮我弄弄么?
    古代学校外墙标语,学校外墙上大字用什么材料
    推荐资讯
    武科大的床一般是好宽啊?
    男人都有处女情节吗?是不是可不可以查出来啊
    懂梦幻西游的进
    手提电脑那种牌子比较好价格又实惠
    优时光在什么地方啊,我要过去处理事情
    自由幻想两个问题
    姓黄的女孩叫什么好呢
    彩虹岛安装后那里领奖
    世博开幕式有没有周杰伦
    我开通了AVA 怎么帮别人开
    怎么点短信超人图标呀
    现在有没有比较HIGH的视觉摇滚乐队
    正方形一边上任一点到这个正方形两条对角线的
    阴历怎么看 ?