zoukankan      html  css  js  c++  java
  • [C] 希尔排序,非递归的快速排序,递归的快速排序,堆排序,归并排序,基数排序

    来源:网络

    #include<stdio.h>
    #include
    <stdlib.h>
    struct node
    {
    int key;
    }r[
    20];

    struct rnode
    {
    int key;
    int point;
    };

    main()
    {
    void print(struct node a[20],int n);
    int creat();
    void shell(struct node a[20],int n);
    int hoare(struct node a[20],int l,int h);
    void quick1(struct node a[20],int n);
    void quick2(struct node a[20],int l,int h);
    void heap(struct node a[20],int i,int m);
    void heapsort(struct node a[20],int n);
    void merges(struct node a[20],struct node a2[20],int h1,int mid,int h2);
    void mergepass(struct node a[20],struct node a2[20],int l,int n);
    void mergesort(struct node a[20],int n);
    int yx(int m,int i);
    int radixsort(struct rnode a[20],int n);
    int num,l,h,c;
    struct rnode s[20];
    c
    =1;
    while(c!=0)
    {
    printf(
    " 主菜单 \n");
    printf(
    " 1 输入关键字,以-9999表示结束。\n");
    printf(
    " 2 希尔排序 \n");
    printf(
    " 3 非递归的快速排序 \n");
    printf(
    " 4 递归的快速排序 \n");
    printf(
    " 5 堆排序 \n");
    printf(
    " 6 归并排序 \n");
    printf(
    " 7 基数排序 \n");
    printf(
    " 输入选择 (1--7,0表示结束): ");
    scanf(
    "%d",&c);
    switch(c)
    {
    case 1:num=creat();print(r,num);break;
    case 2:shell(r,num);print(r,num);break;
    case 3:quick1(r,num);print(r,num);break;
    case 4:l=0;h=num-1;quick2(r,l,h);
    printf(
    "output quick2sort result:\n");
    print(r,num);
    break;
    case 5:heapsort(r,num);break;
    case 6:mergesort(r,num);print(r,num);break;
    case 7:radixsort(s,num);
    }
    }
    }
    //main end

    void print(struct node a[20],int n)
    {
    int i;
    for(i=0;i<n;i++)
    printf(
    "%5d",a[i ].key);
    printf(
    "\n");
    }
    //print end

    int creat()
    {
    int i,n;
    n
    =0;
    printf(
    "input keys");
    scanf(
    "%d",&i);
    while(i!=-9999)
    {
    r[n].key
    =i;
    n
    ++;
    scanf(
    "%d",&i);
    }
    return(n);
    }
    //creat end

    void shell(struct node a[20],int n)//希尔排序
    {
    int i,j,k;
    for(i=n;i>=1;i--)
    a[i].key
    =a[i-1].key;
    k
    =n/2;
    while(k>=1)
    {
    for(i=k+1;i<=n;i++)
    {
    a[
    0].key=a[i].key;
    j
    =i-k;
    while((a[j].key>a[0].key)&&(j>=0))
    {
    a[j
    +k].key=a[j].key;
    j
    =j-k;
    }
    a[j
    +k]=a[0];
    }
    k
    =k/2;
    }
    for(i=0;i<n;i++)
    a[i].key
    =a[i+1].key;
    printf(
    "输出希尔排序的结果:\n");
    }
    //shell end

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

    int hoare(struct node a[20],int l,int h)//分区处理函数
    {
    int i,j;
    struct node x;
    i
    =l;
    j
    =h;
    x.key
    =a[i].key;
    do
    {
    while((i<j)&&(a[j].key>=x.key))
    j
    --;
    if(i<j)
    {
    a[i].key
    =a[j].key;
    i
    ++;
    }
    while((i<j)&&(a[i].key<=x.key))
    i
    ++;
    if(i<j)
    {
    a[j].key
    =a[i].key;
    j
    --;
    }
    }
    while(i<j);
    a[i].key
    =x.key;
    return(i);
    }
    //hoare end

    void quick1(struct node a[20],int n)
    {
    int i,l,h,tag,top;
    int s[20][2];
    l
    =0;h=n-1;tag=1;top=0;
    do
    {
    while(l<h)
    {
    i
    =hoare(a,l,h);
    top
    ++;
    s[top][
    0]=i+1;
    s[top][
    1]=h;
    h
    =h-1;
    }
    if(top==0)
    tag
    =0;
    else
    {
    l
    =s[top][0];
    h
    =s[top][1];
    top
    --;
    }
    }
    while(tag==1);
    printf(
    "输出非递归快速排序结果:\n");
    }
    //quick end

    void quick2(struct node a[20],int l,int h)//递归的快速排序
    {
    int i;
    if(l<h)
    {
    i
    =hoare(a,l,h);
    quick2(a,l,i
    -1);
    quick2(a,i
    +1,h);
    }
    }
    //quick2 end

    ////////////////////快速排序结束////////////////////////

    ////////////////////堆排序函数//////////////////////////

    void heap(struct node a[20],int i,int m)//调整堆的函数
    {
    struct node x;
    int j;
    x.key
    =a[i].key;
    j
    =2*i;
    while(j<=m)
    {
    if(j<m)
    if(a[j].key>a[j+1].key)
    j
    ++;
    if(a[j].key<x.key)
    {
    a[i].key
    =a[j].key;
    i
    =j;
    j
    =2*i;
    }
    else
    j
    =m+1;
    }
    a[i].key
    =x.key;
    }
    //heap end

    void heapsort(struct node a[20],int n)//堆排序的主体函数
    {
    int i,v;
    struct node x;
    for(i=n;i>0;i--)
    a[i].key
    =a[i-1].key;
    for(i=n/2;i>=1;i--)
    heap(a,i,n);
    printf(
    "输出堆排序结果:\n");
    for(v=n;v>=2;v--)
    {
    printf(
    "%5d",a[1].key);
    x.key
    =a[1].key;
    a[
    1].key=a[v].key;
    a[v].key
    =x.key;
    heap(a,
    1,v-1);
    }
    printf(
    "%5d",a[1].key);
    for(i=0;i<n;i++)
    a[i].key
    =a[i+1].key;
    }
    //heapsort end

    /////////////////堆排序函数结束///////////////////

    //////////////////归并函数////////////////////////

    void merges(struct node a[20],struct node a2[20],int h1,int mid,int h2)
    //归并排序的核心算法
    {
    int i,j,k;
    i
    =h1;j=mid+1;k=h1-1;
    while((i<=mid)&&(j<=h2))
    {
    k
    =k+1;
    if(a[i].key<=a[j].key)
    {
    a2[k].key
    =a[i].key;
    i
    ++;
    }
    else
    {
    a2[k].key
    =a[j].key;
    j
    ++;
    }
    }
    while(i<=mid)
    {
    k
    ++;
    a2[k].key
    =a[i].key;
    i
    ++;
    }
    while(j<=h2)
    {
    k
    ++;
    a2[k].key
    =a[j].key;
    i
    ++;
    }
    }
    //merges end

    void mergepass(struct node a[20],struct node a2[20],int l,int n)
    //一趟归并
    {
    int j,i,h1,mid,h2;
    i
    =0;
    while((n-i)>=2*l)
    {
    h1
    =i;
    mid
    =h1+l-1;
    h2
    =i+2*l-1;
    merges(a,a2,h1,mid,h2);
    i
    =i+2*l;
    }
    if((n-i)<=l)
    for(j=i;j<=n;j++)
    a2[j].key
    =a[j].key;
    else
    {
    h1
    =i;
    mid
    =h1+l-1;
    h2
    =n-1;
    merges(a,a2,h1,mid,h2);
    }
    }
    //mergepass end

    void mergesort(struct node a[20],int n)
    {
    int l;
    struct node a2[20];
    l
    =1;
    while(l<n)
    {
    mergepass(a,a2,l,n);
    l
    =2*l;
    mergepass(a2,a,l,n);
    l
    =2*l;
    }
    printf(
    "输出归并排序的结果:\n");
    }
    //mergesort end

    ///////////////归并函数结束///////////////

    ///////////////基数排序///////////////////

    int yx(int m,int i)//分离关键字倒数第i位有效数字的算法
    {
    int x;
    switch(i)
    {
    case 1:x=m%10;break;
    case 2:x=(m%100)/10;break;
    case 3:x=(m%1000)/100;break;
    case 4:x=(m%10000)/1000;break;
    }
    return(x);
    }
    //yx end

    int radixsort(struct rnode a[20],int n)
    {
    int f[11],e[11],i,j,k,l,p,d,t;
    for(i=1;i<=n;i++)
    {
    a[i].key
    =r[i-1].key;
    a[i].point
    =i+1;
    }
    a[n].point
    =0;
    p
    =1;
    printf(
    "输出关键字有效位数 d\n");
    scanf(
    "%d",&d);
    printf(
    "输出基数排序的结果:\n");
    for(i=1;i<=d;i++)
    {
    for(j=0;j<=10;j++)
    {
    f[j]
    =0;
    e[j]
    =0;
    }
    while(p!=0)
    {
    k
    =yx(a[p].key,i);
    if(f[k]==0)
    {
    f[k]
    =p;
    e[k]
    =p;
    }
    else
    {
    l
    =e[k];
    a[l].point
    =p;
    e[k]
    =p;
    }
    p
    =a[p].point;
    }
    j
    =0;
    while(f[j]==0)
    j
    ++;
    p
    =f[j];t=e[j];
    while(j<10)
    {
    j
    ++;
    while((j<10)&&(f[j]==0))
    j
    ++;
    if(f[j]!=0)
    {
    a[t].point
    =f[j];
    t
    =e[j];
    }
    }
    a[t].point
    =0;
    t
    =p;
    while(t!=0)
    {
    printf(
    "%5d",a[t].key);
    t
    =a[t].point;
    }
    printf(
    "\n");
    }
    return(p);
    }

  • 相关阅读:
    前后端分离开发中动态菜单的两种实现方案
    Spring Security 前后端分离登录,非法请求直接返回 JSON
    Spring Boot2 系列教程(九)Spring Boot 整合 Thymeleaf
    原创的离线版 Redis 教程,给力!
    Spring Boot2 系列教程(八)Spring Boot 中配置 Https
    Anaconda创建环境、删除环境、激活环境、退出环境
    开源一个功能完整的SpringBoot项目框架
    Spring Boot和Spring Cloud学习资源推荐
    Ubuntu 18.04下安装Steam顶级在线游戏平台
    终极手撕之架构大全:分布式+开源框架+微服务+性能优化,够不够?
  • 原文地址:https://www.cnblogs.com/hcbin/p/1711409.html
Copyright © 2011-2022 走看看