数字排序

本文介绍了一个数字排序问题的解决方法,使用二叉排序树和插入排序来统计一组整数中各数字的出现频率,并按频率从高到低输出。通过构建二叉树并遍历输出,再利用插入排序进行最终的有序输出。
试题名称: 数字排序 
时间限制: 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的非负整数。 


用了二叉排序树和插入排序

[cpp]  view plain copy
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. class Node{  
  5. public:  
  6.     int num;  
  7.     int data;  
  8. };  
  9.   
  10. class TNode{  
  11. public:  
  12.     int num;  
  13.     int data;  
  14.     TNode* leftChild;  
  15.     TNode* rightChild;  
  16.     TNode(){  
  17.         data = -1;  
  18.         num = 1;  
  19.         leftChild = NULL;  
  20.         rightChild = NULL;  
  21.     }  
  22.     void add(){  
  23.         num++;  
  24.     }  
  25. };  
  26.   
  27. class Tree{  
  28. private:  
  29.     TNode* top;  
  30.     Node *s;  
  31.     int size;  
  32.     int i;  
  33. public:  
  34.     Tree(){  
  35.         top = NULL;  
  36.         s = NULL;  
  37.         size = 0;  
  38.     }  
  39.     void Insert(int num){  
  40.         if(top==NULL){  
  41.             top = new TNode();  
  42.             top->data = num;  
  43.             size++;  
  44.         }  
  45.         else{  
  46.             TNode* s = top;  
  47.             int c = -1;  
  48.             do{  
  49.                 if(num > s->data){  
  50.                     c = 1;  
  51.                 }  
  52.                 else if(num < s->data){  
  53.                     c = 0;  
  54.                 }  
  55.                 else{  
  56.                     c = 2;  
  57.                 }  
  58.                 switch(c){  
  59.                 case 0:  
  60.                     if(s->leftChild != NULL){  
  61.                         s = s->leftChild;  
  62.                     }  
  63.                     else{  
  64.                         s -> leftChild = new TNode();  
  65.                         s -> leftChild -> data = num;  
  66.                         size++;  
  67.                         return;  
  68.                     }  
  69.                     break;  
  70.                 case 1:  
  71.                     if(s->rightChild != NULL){  
  72.                         s = s->rightChild;  
  73.                     }  
  74.                     else{  
  75.                         s -> rightChild = new TNode();  
  76.                         s -> rightChild -> data = num;  
  77.                         size++;  
  78.                         return;  
  79.                     }  
  80.                     break;  
  81.                 case 2:  
  82.                     s -> add();  
  83.                     return;  
  84.                 default:  
  85.                     break;  
  86.                 };  
  87.             }while(s!=NULL);  
  88.         }  
  89.     }  
  90.     //插入排序  
  91.     void InsertSort(Node *a,int n){  
  92.         int i=0,j;  
  93.         Node temp;  
  94.         for(;++i<n;){  
  95.             for(j=i;--j>=0;){  
  96.                 if(a[j+1].num>a[j].num){  
  97.                     temp = a[j+1];  
  98.                     a[j+1] = a[j];  
  99.                     a[j] = temp;  
  100.                 }  
  101.                 else{  
  102.                     while(j>=0 && a[j+1].num==a[j].num && a[j+1].data<a[j].data){  
  103.                         temp = a[j+1];  
  104.                         a[j+1] = a[j];  
  105.                         a[j] = temp;  
  106.                         j--;  
  107.                     }  
  108.                     break;  
  109.                 }  
  110.             }  
  111.         }  
  112.     }  
  113.   
  114.     void Pre_Sq(TNode *t){  
  115.         if(t){  
  116.             s[i].data = t->data;  
  117.             s[i].num = t->num;  
  118.             i++;  
  119.             Pre_Sq(t->leftChild);  
  120.             Pre_Sq(t->rightChild);  
  121.         }  
  122.     }  
  123.   
  124.   
  125.     void display(){  
  126.         int i = -1;  
  127.         for(;++i<size;){  
  128.             cout<<s[i].data<<" "<<s[i].num<<endl;  
  129.         }  
  130.     }  
  131.     void Pre(){  
  132.         if(top!=NULL){  
  133.             i = 0;  
  134.             s = new Node[size];  
  135.             Pre_Sq(top);  
  136.             InsertSort(s,size);  
  137.         }  
  138.     }  
  139. };  
  140.   
  141. int main(){  
  142.     Tree t;  
  143.     int n,m;  
  144.     cin>>n;  
  145.     while(n--){  
  146.         cin>>m;  
  147.         t.Insert(m);  
  148.     }  
  149.     t.Pre();  
  150.     t.display();  
  151.     return 0;  
  152. }  
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值