7-13 统计工龄(20 分)
给定公司N名员工的工龄,要求按工龄增序输出每个工龄段有多少员工。
输入格式:
输入首先给出正整数N(≤105),即员工总人数;随后给出N个整数,即每个员工的工龄,范围在[0, 50]。
输出格式:
按工龄的递增顺序输出每个工龄的员工个数,格式为:“工龄:人数”。每项占一行。如果人数为0则不输出该项。
输入样例:
8
10 2 0 5 7 2 5 2
输出样例:
0:1
2:3
5:2
7:1
10:1
1 #include<iostream> 2 using namespace std; 3 void swap(int &a,int &b){ 4 int t=a; a=b; b=t; 5 } 6 void show_result(int A[],int N){ 7 int cnt=0,age=A[0]; 8 for(int i=0;i<N;i++){ 9 if(A[i]==age) cnt++; 10 else {cout<<age<<":"<<cnt<<endl; age=A[i]; cnt=1;} 11 } 12 cout<<age<<":"<<cnt<<endl; 13 } 14 void Bubble_sort(int A[],int N){//冒泡排序法 15 for(int i=1;i<=N-1;i++){ 16 int flag=0; 17 for(int j=0;j<=N-1-i;j++) 18 if(A[j]>A[j+1]) {flag=1; swap(A[j],A[j+1]);} 19 if(flag==0) break; 20 } 21 } 22 void Insertion_sort(int A[],int N){//插入排序法 23 int i,j; 24 for(i=1;i<N;i++){ 25 int temp=A[i]; 26 for(j=i;j>0;j--){ 27 if(A[j-1]>temp) A[j]=A[j-1]; 28 else break; 29 } 30 A[j]=temp; 31 } 32 } 33 void percdown(int A[],int N,int i){//最大堆下滤 34 int parent,child,temp=A[i]; 35 for(parent=i;2*parent+1<=N-1;parent=child){ 36 child=2*parent+1; 37 if(child<N-1&&A[child+1]>A[child]) child++; 38 if(temp<A[child]) A[parent]=A[child]; 39 else break; 40 } 41 A[parent]=temp; 42 } 43 void buildheap(int A[],int N){//建立最大堆 44 for(int i=(N-1)/2;i>=0;i--){ 45 percdown(A,N,i); 46 } 47 } 48 void heap_sort(int A[],int N){//堆排序 49 buildheap(A,N); 50 int size=N; 51 for(int i=1;i<=N-1;i++){ 52 swap(A[0],A[size-1]); 53 percdown(A,--size,0); 54 } 55 } 56 void shell_sort(int A[],int N){//Sdegewick增量序列的希尔排序 57 int IncrementSequence_Sedgewick[]={0, 58 1,5,19,41,109,209,505,929, 59 2161,3905,8929,16001,36289,64769,146305,260609, 60 587521,1045505,2354689,4188161,9427969,16764929,37730305,67084289, 61 150958081,268386305,603906049,1073643521}; 62 int i=1,len,j,k; 63 while(IncrementSequence_Sedgewick[++i]<=N){} 64 for(i=i-1;i>=1;i--){ 65 len=IncrementSequence_Sedgewick[i]; 66 for(j=len;j<N;j++){ 67 int temp=A[j]; 68 for(k=j;k>=len;k-=len) 69 { 70 if(temp<A[k-len]) swap(A[k],A[k-len]); 71 else break;} 72 A[k]=temp; 73 } 74 } 75 } 76 void Merge(int A[],int l,int r,int rend,int temp[]){ 77 int lend=r-1,n=rend-l+1,cnt=l; 78 while(l<=lend&&r<=rend){ 79 if(A[l]<A[r]) temp[cnt++]=A[l++]; 80 else temp[cnt++]=A[r++]; 81 } 82 while(l<=lend) temp[cnt++]=A[l++]; 83 while(r<=rend) temp[cnt++]=A[r++]; 84 for(int i=0;i<n;i++) 85 A[rend]=temp[rend--]; 86 } 87 void Msort(int A[],int l,int rend,int temp[]){ 88 int center; 89 if(l<rend){ 90 center=(l+rend)/2; 91 Msort(A,l,center,temp); 92 Msort(A,center+1,rend,temp); 93 Merge(A,l,center+1,rend,temp); 94 } 95 } 96 void Merge_sort(int A[],int N){//归并排序(递归) 97 int *temp; 98 temp=(int*)malloc(N*sizeof(int)); 99 if(temp!=NULL){ 100 Msort(A,0,N-1,temp); 101 free(temp); 102 } 103 else cout<<"there is no enough space!"<<endl; 104 } 105 void Merge1(int A[],int l,int r,int rend,int temp[]){ 106 int lend=r-1,n=rend-l+1,cnt=l; 107 while(l<=lend&&r<=rend){ 108 if(A[l]<A[r]) temp[cnt++]=A[l++]; 109 else temp[cnt++]=A[r++]; 110 } 111 while(l<=lend) temp[cnt++]=A[l++]; 112 while(r<=rend) temp[cnt++]=A[r++]; 113 } 114 void Merge_pass(int A[],int N,int len,int temp[]){ 115 int i; 116 for(i=0;i<N-1-2*len;i+=2*len) 117 Merge1(A,i,i+len,i+2*len-1,temp); 118 if(i+len<N) Merge1(A,i,i+len,N-1,temp); 119 else 120 for(int j=i;j<N;j++) temp[j]=A[j]; 121 } 122 void Merge_sort2(int A[],int N){//(非递归)归并排序 123 int *temp; 124 temp=(int*)malloc(N*sizeof(int)); 125 if(temp!=NULL){ 126 int len=1; 127 while(len<N){ 128 Merge_pass(A,N,len,temp); 129 len*=2; 130 Merge_pass(temp,N,len,A); 131 len*=2; 132 } 133 free(temp); 134 } 135 else cout<<"there is no enough space !"<<endl; 136 } 137 int getpivot(int A[],int l,int r){//获得pivot 138 int m=(l+r)/2; 139 if(A[m]<A[l]) swap(A[m],A[l]); 140 if(A[r]<A[l]) swap(A[r],A[l]); 141 if(A[r]<A[m]) swap(A[r],A[m]); 142 swap(A[m],A[r-1]); 143 return A[r-1]; 144 } 145 void Qsort(int A[],int l,int r){//快速排序递归核心算法 146 int pivot,i,j,cutoff=1000; 147 if(r-l>=cutoff){ 148 int pivot=getpivot(A,l,r); 149 i=l; j=r-1; 150 while(1){ 151 while(A[++i]<pivot) {} 152 while(A[--j]>pivot) {} 153 if(i<j) swap(A[i],A[j]); 154 else break; 155 } 156 swap(A[r-1],A[i]); 157 Qsort(A,l,i-1); 158 Qsort(A,i+1,r); 159 } 160 else Insertion_sort(A+l,r-l+1); 161 } 162 void Quick_sort(int A[],int N){// 快速排序 163 Qsort(A,0,N-1); 164 } 165 int main(){ 166 int N; cin>>N; 167 int A[N]; 168 for(int i=0;i<N;i++) 169 cin>>A[i]; 170 //Bubble_sort(A,N); 171 //Insertion_sort(A,N); 172 //heap_sort(A,N); 173 //shell_sort(A,N); 174 //Merge_sort2(A,N); 175 Quick_sort(A,N); 176 show_result(A,N); 177 return 0; 178 }