10-排序4 统计工龄 (20分) c语言实现

11 篇文章 1 订阅

给定公司N名员工的工龄,要求按工龄增序输出每个工龄段有多少员工。

输入格式:
输入首先给出正整数N(≤10
​5
​​ ),即员工总人数;随后给出N个整数,即每个员工的工龄,范围在[0, 50]。

输出格式:
按工龄的递增顺序输出每个工龄的员工个数,格式为:“工龄:人数”。每项占一行。如果人数为0则不输出该项。

输入样例:
8
10 2 0 5 7 2 5 2
输出样例:
0:1
2:3
5:2
7:1
10:1

具体思路

很简单的快速排序

具体代码

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAX 100000
int A[MAX];/*数组*/
void Swap(int *a,int *b)/*交换函数*/
{
    int t=*a;
    *a=*b;
    *b=t;
    
}
int Me(int le,int ri)/*找出基准,这里应用的是找出头,尾,中间三个数的中位数,常规的快排选基准*/
{
    int Ce = (le+ri)/2;
    if(A[le]>A[Ce])
        Swap(&A[le],&A[Ce]);
    if(A[le]>A[ri])
        Swap(&A[le],&A[ri]);
    if(A[Ce]>A[ri])
        Swap(&A[Ce],&A[ri]);
    Swap(&A[Ce],&A[ri-1]);
    return A[ri-1];/*储存基准的位置*/
}

void Qsort(int le,int ri)
{
    int P,L,H,C;
    C=5;/*这个是衡量是否应该快速排序,当数据量很小时,我们该用插入排序,c的值可以自己定,不应该太大*/
    if(C<=(ri-le))
    {
    P=Me(le ,ri);/*基准*/
    L=le;
    H=ri-1;
    while(1)
    {
        while(A[++L]<P);/*比它大,就去右边,比他小就去左边*/
        while(A[--H]>P);
        if( L<H)
            Swap(&A[L],&A[H]);
        else
            break;
    }
    
    Swap(&A[L],&A[ri-1]);
    Qsort(le,L-1);//解决左边
    Qsort(L+1,ri);//解决右边
    }
    else
    {
        InsertionSort(le,ri+1);//插入排序
    }

}
void InsertionSort( int qi, int N )
{ /* 插入排序 */
     int P, i;
     int Tmp;

     for ( P=qi+1; P<N; P++ ) {
         Tmp = A[P]; /* 取出未排序序列中的第一个元素*/
         for ( i=P; i>0 && A[i-1]>Tmp; i-- )
             A[i] = A[i-1]; /*依次与已排序序列中元素比较并右移*/
         A[i] = Tmp; /* 放进合适的位置 */
     }
}
void QQsort(int N)
{
    Qsort(0,N-1);
    int i;
    int j=0;
    int sum=A[0];
    int k=0;

    for(i=0;i<N;i++)/*输出,记录相同元素的个数,我这个时间复杂度应该时o(n),很好*/
    {
        if(sum==A[i])
            j++;
        else
        {
            if(k==0)
                k=1;
            else
                printf("\n");
            printf("%d:%d",sum,j);
            sum=A[i];
            j=1;
        }
    }
    if(k==1)
        printf("\n");
    printf("%d:%d",sum,j);

}
int main()
{

    int i,j;
    scanf("%d",&j);
    for(i=0;i<j;i++)
        scanf("%d",&A[i]);
    QQsort(j);
    return 0;
}

具体结果

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值