10-排序4 统计工龄(20 分)
题目地址:10-排序4 统计工龄(20 分)
题目描述:
给定公司N名员工的工龄,要求按工龄增序输出每个工龄段有多少员工。
输入格式:
输入首先给出正整数 N(≤105) N ( ≤ 10 5 ) ,即员工总人数;随后给出N个整数,即每个员工的工龄,范围在[0, 50]。输出格式:
按工龄的递增顺序输出每个工龄的员工个数,格式为:“工龄:人数”。每项占一行。如果人数为0则不输出该项。
解题方法:
这题比较简单,用map轻松可以解决该问题,通过把工龄设为键,每出现一个工龄就自加1
此外,本题还给出了桶排序程序,方便读者进行对比。
就目前两个结果进行对比来看,利用map实现无论是在时间还是空间都优于桶排序。
程序:
简单版本map实现:
#include <stdio.h>
#include <stdlib.h>
#include <map>
using namespace std;
/* 用map做映射,解决排序问题 */
int main(int argc, char const *argv[])
{
int N, x;
scanf("%d", &N);
map<int, int> M;
for (int i = 0; i < N; i++)
{
scanf("%d", &x);
M[x]++;
}
map<int, int>::iterator it;
for (it = M.begin(); it != M.end(); it++)
printf("%d:%d\n", it->first, it->second);
return 0;
}
基数排序算法:
#include <stdio.h>
#include <stdlib.h>
using namespace std;
/* 桶排序 */
#define MaxDight 5
#define Radix 10
/* 桶元素结点 */
typedef struct Node* PtrToNode;
struct Node
{
int key;
PtrToNode next;
};
/* 桶头结点 */
typedef struct HeadNode Bucket[Radix];
struct HeadNode
{
PtrToNode Head, tail;
};
int GetDight(int X, int D)
{ /* 获取低位数字 */
int d;
for (int i = 1; i <= D; i++)
{
d = X % Radix;
X /= Radix;
}
return d;
}
PtrToNode LSDRadixSort(int A[], int N)
{ /* 基数排序 次位优先 */
int D;
Bucket B;
PtrToNode list = NULL, tmp, p;
for (int i = 0; i < Radix; i++) /* 初始化桶 */
B[i].Head = B[i].tail = NULL;
for (int i = 0; i < N; i++)
{ /* 用头插法将数组插入链表 */
tmp = (PtrToNode)malloc(sizeof(Node));
tmp->key = A[i];
tmp->next = list;
list = tmp;
}
for (int i = 1; i <= MaxDight; i++)
{
p = list;
while (p)
{
D = GetDight(p->key, i);
/* 把当前结点从list中摘除 */
tmp = p;
p = p->next;
tmp->next = NULL;
if (B[D].Head == NULL)
B[D].Head = B[D].tail = tmp;
else
{
B[D].tail->next = tmp;
B[D].tail = tmp;
}
}
list = NULL; /* 接下来进行收集 */
for (int i = Radix-1; i >= 0; i--)
{
if (B[i].Head != NULL)
{ /* 把桶倒入链表 */
B[i].tail->next = list;
list = B[i].Head;
B[i].Head = B[i].tail = NULL; /* 清空桶 */
}
}
}
return list;
}
int main()
{
int N, cnt = 1;
scanf("%d", &N);
int A[N];
for (int i = 0; i < N; i++)
scanf("%d", &A[i]);
PtrToNode list = LSDRadixSort(A, N);
PtrToNode tmp = list;
while (1)
{
list = list->next;
if (list && list->key == tmp->key)
cnt++;
else
{
printf("%d:%d\n", tmp->key, cnt);
cnt = 1;
tmp = list;
}
if (list == NULL)
break;
}
}
如果对您有帮助,帮忙点个小拇指呗~