给定公司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;
}