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[] */
}