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);
    }

  • 相关阅读:
    垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
    自考感悟,话谈备忘录模式
    [每日一题] OCP1z0-047 :2013-07-26 alter table set unused之后各种情况处理
    Java实现 蓝桥杯 算法提高 p1001
    Java实现 蓝桥杯 算法提高 拿糖果
    Java实现 蓝桥杯 算法提高 拿糖果
    Java实现 蓝桥杯 算法提高 求arccos值
    Java实现 蓝桥杯 算法提高 求arccos值
    Java实现 蓝桥杯 算法提高 因式分解
    Java实现 蓝桥杯 算法提高 因式分解
  • 原文地址:https://www.cnblogs.com/hcbin/p/1711409.html
Copyright © 2011-2022 走看看