代码-排序

#include<stdio.h>
#include<stdlib.h>
#define M  20
#define ElemType int
typedef struct
{
    ElemType   *data;
    int   Length;
    int   ListSize;
}SqList;

void disp1(int *a,int n)
{    int i;
    printf(" 排序前:*****\n");
    for(i=1;i<=n;i++)
        printf(" %3d",a[i]);
    printf("\n");
}

void disp2(int *a,int n)
{ int i;
    printf(" 排序后:*****\n");
    for(i=1;i<=n;i++)
        printf(" %3d",a[i]);
    a[0]=-1;
    printf("\n");
}

void create(int *a,int *b,int  *n)
{int i;
    printf("输入待排序的元素总个数:\n");
    scanf("%d",n);
    for(i=1;i<=*n;i++)
    {  printf("输入第 %d个元素:\n",i);
        scanf("%d",&a[i]);
        b[i]=a[i];
    }
    a[0]=b[0]=0;
}


void insertsort(int *a,int n)
{  int i,j;
    for(i=2 ; i <= n ; i++)
    {  a[0] = a[i];
        for(j=i-1; a[0]< a[j]; j-- )
            a[j+1] = a[j];
        a[j+1] = a[0];
    }
}

void  ShellInsert(int *a,int dk,int n){
    int i,j;
    for(i=dk+1;i<=n; ++ i)
        if(a[i] <= a[i-dk])
        { a[0]=a[i];
            for( j=i-dk; j>0 &&(a[0]<a[j]); j=j-dk)
                a[j+dk]=a[j];
                a[j+dk]=a[0];
        }}
void xiersort(int *a,int n)//希尔排序
{
    int d[3] = {5, 3, 1};
    {
        for (int k = 0; k < 3; ++k)
            ShellInsert(a,d[k],n); //增量为d[k]的一趟插入排序
    }
}

void maopaosort(int *a,int n)//冒泡
{  int i,j,change,t;

    for(i=1;i<n;i++)
    { change=0;
        for(j=1;j<=n-i;j++)
            if(a[j]>a[j+1])
            { t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
                change=1;
            }

        if(change==0)
            break;
    }
}


int  quicksort(int *a,int low, int high)//快速排序
{  int i=low,j=high;
    a[0]=a[i];
    while(i<j)
    {     while(i<j&&a[j]>=a[0])  --j;
        a[i]=a[j];
        while(i<j&&a[i]<=a[0])   ++i;
        a[j]=a[i];
    }
    a[i]=a[0];
    //quicksort(a,1,i-1);
    //quicksort(a,i+1,n);
    return i;
}

void quick(int *a,int low,int high)
{
    int r;
    if (low<high)
    { r=quicksort(a,low,high);
        quick(a,low,r-1);
        quick(a,r+1,high);
    }
}



void jiandansort(int *a,int n)//简单选择排序
{ int i,j,t;
    int min; //待排序数组中最小值的下标
    for (i = 0; i < n - 1; ++i)//i = 0,第一次待排数组为所有数
    {
        min = i;
        for (j = i + 1; j < n; ++j)
        {
            if (a[j] < a[min])
            {
                min = j;//
            }
        }
        //将a[i]与a[min]交换位置
        t = a[i];
        a[i] = a[min];
        a[min] = t;
    }

}




void  adjust(int *a,int low, int top)
{ int j;
    a[0]=a[low];
    for(j=2*low;j<=top;j*=2)
    { if(j<top&&a[j]>a[j+1])
            j++;
        if(a[j]<a[0])
        {  a[low]=a[j];
            low=j;
        }
    }
    a[low]=a[0];

}

int maximum(int *a,int n)
{
    int i=1,m;
    m=a[1];
    while(i<=n)
    {
        if(a[i]>m)	m=a[i];
        i++;
    }
    return m;
}



void counting_sort(int *a,int n)
{
    int i,m,*c,*b;
    m=maximum(a,n);
   // printf("%d",m);
    c=(int *)malloc(sizeof(int)*(m+1));			//建立一个辅助数组,存储计数信息
    b=(int *)malloc(sizeof(int)*(n+1));		//用于存放排好序的数组

    for(i=0;i<=m;i++)
        c[i]=0;
    for(i=1;i<=n;i++)							//A[i]作为下标,将对应的c数组置位
        c[a[i]]++;

    for(i=1;i<=m;i++)
        c[i]=c[i]+c[i-1];						//c[A[i]]中存储了小于或等于A[i]的元素的个数

    for(i=1;i<=n;i++)
    {
        b[c[a[i]]]=a[i];
        c[a[i]]--;
    }
    disp2(b,n);
    free(c);
}

int Partition(ElemType *a, int n)
{
    int i = 1, j = n;
    ElemType pivot = a[j];
    while (i < j) {
        while (i < j && a[i] <= pivot) i++;
        if (i < j) a[j] = a[i];
        while (i < j && a[j] >= pivot) j--;
        if (i < j) a[i] = a[j];
    }
    a[i] = pivot;
    return i;
}

void mnulist()
{  printf("\n 1---------  插入排序 ");
    printf("\n 2---------  希尔排序");
    printf("\n 3---------冒泡排序");
    printf("\n  4---------  快速排序");
    printf("\n  5--------  简单选择排序");
    printf("\n 6----------  堆排序");
    printf("\n 7--------- 创建排序表");
    printf("\n 8--------- 计数排序");
    printf("\n 9--------- 将K放在正确的位置");
    printf("\n 0--------- 退出\n");
}


void main( )
{int a[M+1],b[M+1],n=0,i;
    int K=100;
    create(a,b,&n);
    while (K!=0)
    { mnulist();
        printf("请输入功能选项:");
        scanf("%d",&K);
        for(i=1;i<=n;i++)
            a[i]=b[i];
        if (K==1)
        {disp1(a,n);
            insertsort(a,n) ;
            disp2(a,n);  }

        if (K==2)
        { disp1(a,n);
            xiersort(a,n);
            disp2(a,n); }
        if (K==3)
        {  disp1(a,n);
            maopaosort(a,n);
            disp2(a,n); }
        if (K==4)
        {
            disp1(a,n);
            quick(a,1,n);
            disp2(a,n);
        }
        if(K==8){
            disp1(a,n);
            counting_sort(a, n);
        }
        if(K==9){
            disp1(a,n);
            int p = Partition(a, n);
            printf("Kn的正确位置是:%d",p);
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的锦鲤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值