试题名称: 数字排序
时间限制: 1.0s
内存限制: 256.0MB
问题描述: 问题描述
给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。
输入格式
输入的第一行包含一个整数n,表示给定数字的个数。
第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出格式
输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。
样例输入
12
5 2 3 3 1 3 4 2 5 2 3 5
样例输出
3 4
2 3
5 3
1 1
4 1
评测用例规模与约定
时间限制: 1.0s
内存限制: 256.0MB
问题描述: 问题描述
给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。
输入格式
输入的第一行包含一个整数n,表示给定数字的个数。
第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出格式
输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。
样例输入
12
5 2 3 3 1 3 4 2 5 2 3 5
样例输出
3 4
2 3
5 3
1 1
4 1
评测用例规模与约定
1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数。
用了二叉排序树和插入排序
- #include<iostream>
- using namespace std;
- class Node{
- public:
- int num;
- int data;
- };
- class TNode{
- public:
- int num;
- int data;
- TNode* leftChild;
- TNode* rightChild;
- TNode(){
- data = -1;
- num = 1;
- leftChild = NULL;
- rightChild = NULL;
- }
- void add(){
- num++;
- }
- };
- class Tree{
- private:
- TNode* top;
- Node *s;
- int size;
- int i;
- public:
- Tree(){
- top = NULL;
- s = NULL;
- size = 0;
- }
- void Insert(int num){
- if(top==NULL){
- top = new TNode();
- top->data = num;
- size++;
- }
- else{
- TNode* s = top;
- int c = -1;
- do{
- if(num > s->data){
- c = 1;
- }
- else if(num < s->data){
- c = 0;
- }
- else{
- c = 2;
- }
- switch(c){
- case 0:
- if(s->leftChild != NULL){
- s = s->leftChild;
- }
- else{
- s -> leftChild = new TNode();
- s -> leftChild -> data = num;
- size++;
- return;
- }
- break;
- case 1:
- if(s->rightChild != NULL){
- s = s->rightChild;
- }
- else{
- s -> rightChild = new TNode();
- s -> rightChild -> data = num;
- size++;
- return;
- }
- break;
- case 2:
- s -> add();
- return;
- default:
- break;
- };
- }while(s!=NULL);
- }
- }
- //插入排序
- void InsertSort(Node *a,int n){
- int i=0,j;
- Node temp;
- for(;++i<n;){
- for(j=i;--j>=0;){
- if(a[j+1].num>a[j].num){
- temp = a[j+1];
- a[j+1] = a[j];
- a[j] = temp;
- }
- else{
- while(j>=0 && a[j+1].num==a[j].num && a[j+1].data<a[j].data){
- temp = a[j+1];
- a[j+1] = a[j];
- a[j] = temp;
- j--;
- }
- break;
- }
- }
- }
- }
- void Pre_Sq(TNode *t){
- if(t){
- s[i].data = t->data;
- s[i].num = t->num;
- i++;
- Pre_Sq(t->leftChild);
- Pre_Sq(t->rightChild);
- }
- }
- void display(){
- int i = -1;
- for(;++i<size;){
- cout<<s[i].data<<" "<<s[i].num<<endl;
- }
- }
- void Pre(){
- if(top!=NULL){
- i = 0;
- s = new Node[size];
- Pre_Sq(top);
- InsertSort(s,size);
- }
- }
- };
- int main(){
- Tree t;
- int n,m;
- cin>>n;
- while(n--){
- cin>>m;
- t.Insert(m);
- }
- t.Pre();
- t.display();
- return 0;
- }
本文介绍了一个数字排序问题的解决方法,使用二叉排序树和插入排序来统计一组整数中各数字的出现频率,并按频率从高到低输出。通过构建二叉树并遍历输出,再利用插入排序进行最终的有序输出。
2605

被折叠的 条评论
为什么被折叠?



