10-排序4 统计工龄 (20 分)

10-排序4 统计工龄 (20 分)
给定公司N名员工的工龄,要求按工龄增序输出每个工龄段有多少员工。

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

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

// 5s.cpp : Defines the entry point for the console application.
//

//#include "stdafx.h"

#include <stdio.h>
#include <string.h>
#include <string.h>
#include <stdlib.h>
void merge_sort(int a[],int n);
void merge(int a[],int temp[],int n,int length);
void merge1( int A[], int TmpA[], int L, int R, int RightEnd );
int main(void)
{
    int n;
    scanf("%d",&n);
    int i;
    int a[100000];
    for(i = 0;i < n;i++)
    {
        scanf("%d",&a[i]);
    }
     merge_sort(a,n);
    return 0;
}
void merge_sort(int a[],int n)
{
    int length;
    int *temp;
    temp = malloc(n * sizeof(int) );
    length = 1;
    if(temp != NULL)
    {    while(length < n)
        {
            merge(a,temp,n,length);
            length *= 2;
            merge(temp,a,n,length);
            length *= 2;
        }
    free(temp);

    }
         int i,j;
     int b[100000]  = {0};
     int m = 0;
    int s;
     for(i = 0; i < n;i++)
     {
         s = a[i];
         for(j = 0;(j < n)&&(s >= 0) ;j++)
             if(s == a[j])
             {
                 b[m] = b[m] + 1;
                 a[j] = -1;
             }
         
         if(b[m] != 0)
         printf("%d:%d\n",s,b[m]);
          m++;
             
     }
        
}
void merge(int a[],int temp[],int n,int length)
{
    int i,j;
    for(i = 0;i <= n - 2*length;i += length * 2)
        merge1(a,temp,i,i+length,i+2*length-1);
    if(i + length < n)
        merge1(a,temp,i,i+length,n-1);
    else
        for(j = i;j < n;j++)
            temp[j] = a[j];
        
}
void merge1( int A[], int TmpA[], int L, int R, int RightEnd )
{ /* 将有序的A[L]~A[R-1]和A[R]~A[RightEnd]归并成一个有序序列 */
     int LeftEnd, NumElements, Tmp;
     int i;
     
     LeftEnd = R - 1; /* 左边终点位置 */
     Tmp = L;         /* 有序序列的起始位置 */
     NumElements = RightEnd - L + 1;
     
     while( L <= LeftEnd && R <= RightEnd ) {
         if ( A[L] <= A[R] )
             TmpA[Tmp++] = A[L++]; /* 将左边元素复制到TmpA */
         else
             TmpA[Tmp++] = A[R++]; /* 将右边元素复制到TmpA */
     }

     while( L <= LeftEnd )
         TmpA[Tmp++] = A[L++]; /* 直接复制左边剩下的 */
     while( R <= RightEnd )
         TmpA[Tmp++] = A[R++]; /* 直接复制右边剩下的 */
         
     for( i = 0; i < NumElements; i++, RightEnd -- )
         A[RightEnd] = TmpA[RightEnd]; /* 将有序的TmpA[]复制回A[] */
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值