#include <cstdio>
#include <cstring>
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10000000;
const int maxs = 10000;
int n;
unsigned a[maxn], b[maxn],res[maxn], ord[maxn];
unsigned cnt[maxs + 1];
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; ++i)
scanf("%d%d", &a[i], &b[i]);
memset(cnt, 0, sizeof(cnt));
/*
for (int i = 0; i <=10; ++i)
{
cout<<"cnt["<<i<<"]="<<cnt[i]<<endl;
}
*/
for (int i = 0; i < n; ++i)
++cnt[b[i]]; // ①利用 cnt 数组统计数量
/*
解析:此处是对第二关键字进行计数排序。
题目中给出提示,先按第二关键字排序。
并且根据填空2对ord进行更改,
可知此时是対第二关键字进行排序。
*/
for (int i = 0; i <= maxs; ++i)
{
if( cnt[i] )
{
cout<<"001cnt["<<i<<"]="<<cnt[i]<<endl;
}
}
cout<<"-----------------"<<endl;
//前缀和
for (int i = 0; i < maxs; ++i)
cnt[i + 1] += cnt[i];
for (int i = 0; i <10; ++i)
{
cout<<"002cnt["<<i<<"]="<<cnt[i]<<endl;
}
cout<<"-----------------"<<endl;
// 记录初步排序结果
for (int i = 0; i < n; ++i)
{
ord[--cnt[b[i]]] = i;//②
cout<<"i="<<i<<" b["<<i<<"]="<<b[i]<<" ";
cout<<" "<<cnt[b[i]]<<endl;
/*
解析:cnt[b[i]]表示按第二关键字,第i个数排第几位。
ord[i]表示第i小的数在原序列的位置
*/
}
cout<<"-----------------"<<endl;
for (int i = 0; i < n; ++i)
{
cout<<"ord["<<i<<"]="<<ord[i]<<endl;
}
//第一关键字排序
cout<<"--------第一关键字排序----------"<<endl;
memset(cnt, 0, sizeof(cnt));
for (int i = 0; i < n; ++i)
++cnt[a[i]]; // ③;利用 cnt 数组统计数量
for (int i = 0; i <= maxs; ++i)
{
if( cnt[i] )
{
cout<<"003cnt["<<i<<"]="<<cnt[i]<<endl;
}
}
cout<<"***********************************"<<endl;
/*
解析:对第一关键字计数,并做各关键词的数量统计工作,
因此将a[i]对应的元素数量自增一。
*/
for (int i = 0; i < maxs; ++i)
cnt[i + 1] += cnt[i];
for (int i = 0; i <10; ++i)
{
cout<<"004cnt["<<i<<"]="<<cnt[i]<<endl;
}
cout<<"***********************************"<<endl;
for (int i = n - 1; i >= 0; --i)
res[--cnt[a[ord[i]]]] = ord[i]; //④记录最终排序结果
/*
3
3 4
2 4
3 3
解析:
对应填空2 ord[i]记录了第二关键字第i小的数在原序列的位置。
此时res[i]记录了第一关键字第i小的数在原序列的位置。
*/
for (int i = 0; i < n; i++)
{
printf("i=%d res[%d]=%d ord[%d]=%d ",i,i,res[i],i,ord[i]);
//输出第1关键字排序后的位置
printf("%d %d\n", a[res[i]], b[res[i]]);
}
return 0;
}
例如有三对整数
(3,4)、
(2,4)、
(3,3),
那么排序之后应该是(2,4)、(3,3)、(3,4) 。
3
3 4
2 4
3 3
第二关键字排序
3 3
2 4
3 4
第一关键字排序
2 4
3 3
3 4
排序——计数排序(Count sort)
计数排序 百度百科
什么是计数排序?
计数排序(count sort)
计数排序
经典排序算法之“计数排序”
排序算法:计数排序【图解+代码】
计数排序
六分钟内教你学会计数排序算法
【排序算法】计数排序
计数排序
C++实现计数排序
C++算法之计数排序