某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5×10^9)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。

采用sort直接排序,直接略过排序门槛;

 1 //P1097 统计数字
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 //const int MAX=200001;
 6 
 7 int main()
 8 {
 9     int i,n,count;
10     cin>>n;
11     int *a=new int[n];
12     for(i=0;i<n;i++)    cin>>a[i];
13     sort(a,a+n);
14 
15     for(i=0;i<n;i++)
16     {
17         count=1;
18         cout<<a[i]<<" ";
19         while(a[i+1]==a[i])  //如果后一位数相同,则统计叠加,否则输出统计结果
20         {
21             count++;i++;
22         }
23         cout<<count<<endl;
24     }
25 
26     delete []a;
27     return 0;
28 }

注:sort(start,end+1,排序方法),start为排序起始地址,而end+1是指实际上是最后一个排序地址的下一个地址(为什么要+1呢?因为这样的设计是整个stl的设计原则决定的,STL的容器在传递迭代器参数时都是传递容器的开始位置,以及容器结尾的下一位置);排序方法默认升序,也可重写,注意返回bool型或int型。

补上快排与堆排序的代码:

 1 void QuickSort(int a[],int left,int right)
 2 {
 3     if(left<right)
 4     {
 5         int i=Division(a,left,right);
 6         QuickSort(a,left,i-1);
 7         QuickSort(a,i+1,right);
 8     }
 9 }
10 
11 
12 int Division(int a[],int left,int right)     //常用的找分界点方法
13 {
14     int temp=a[left];
15     while(left<right)
16     {
17         while(left<right&&a[right]>=temp)  right--;
18         a[left]=a[right];
19         while(left<right&&a[left]<=temp)    left++;
20         a[right]=a[left];
21     }
22     a[left]=temp;
23     return left;
24 }
25 
26 int Division(int a[],int left,int right)   //另一种方式,通过将小于等于基准值的数全部集中到基准点左侧,count值即为最终基准值所在序号
27 {
28     int t,temp=a[left];
29     int count=left;
30     for(int i=left+1;i<=right;i++)  
31     {
32         if(a[i]<=temp)
33         {
34             count++;
35             t=a[i];
36             a[i]=a[count];
37             a[count]=t;
38         }
39     }
40     t=a[left]; 
41     a[left]=a[count];
42     a[count]=t;
43     return count;
44 
45 }
46 
47 
48 
49 ////////堆排
50 void HeapSort(int a[],int n)
51 {
52     for(int i=n/2-1;i>=0;i--)    HeapAdjust(a,i,n);
53     for(int i=n-1;i>0;i--)    
54     {
55         int t=a[0];
56         a[0]=a[i];
57         a[i]=t;
58         HeapAdjust(a,0,i);
59     }
60 }
61 
62 void HeapAdjust(int a[],int s,int n)
63 {
64     int j,temp;
65     while(2*s+1<n)
66     {
67         j=2*s+1;
68         if((j+1<n)&&(a[j+1]>a[j]))    j++;
69         if(a[s]<a[j])
70         {
71             temp=a[s];
72             a[s]=a[j];
73             a[j]=temp;
74             s=j;
75         }
76         else break;
77     }
78 }

 

最简短做法是使用map与set, 一个统计数,一个统计值;

 1 //#include<bits/stdc++.h>
 2 #include<iostream>
 3 #include<map>
 4 #include<set>
 5 
 6 using namespace std;
 7 int main() {
 8     map <int,int> num;
 9     set <int> a;
10     int n,i,q;
11     cin>>n;
12     for(i=1; i<=n; i++) {
13         cin>>q;
14         num[q]++;
15         a.insert(q);
16     }
17     for(set<int>::iterator it=a.begin(); it!=a.end(); it++)
18         cout<<*it<<" "<<num[*it]<<endl;
19 }

 

posted on 2019-03-30 23:24  tobyte  阅读(335)  评论(0编辑  收藏  举报