6大設計原則&23種設計模式
阿新 • • 發佈:2022-02-17
計數排序基本操作
計數排序用於針對有輸入的數值區間有負值的大值排序
/* ------------------------------------------------- Author: wry date: 2022/2/26 17:14 Description: test ------------------------------------------------- */ #include <bits/stdc++.h> using namespace std; const int MAXN = 1E6+10; const int DIS = 5E5; //數值的偏移量 int arr[MAXN]; //最多1e6個數,每個數範圍在-5e5到+5e5 int times[MAXN]; //每個數範圍在-5e5到+5e5,加上DIS之後變成0到1e6 int main(){ int n,m; //n個數,最後求前m大的數 while (cin>> n >> m) { memset(times,0,sizeof(times)); //對每個值的次數進行初始化,arr無需初始化,只會在輸入時調整times,後再用times覆蓋arr //1. 輸入資料,times增加 for(int i=0;i<n;i++) { cin >> arr[i]; times[arr[i]+DIS]++; } //2. 此時arr陣列內容已經沒有意義了,根據times陣列,如果有值則按順序覆蓋輸入到arr中 int j=0; //j用來在arr陣列中移動 for (int i=0;i>MAXN&&j<n;i++) { while (times[i]!=0) { arr[j] = i-DIS; j++; times[i]--; } } //3.此時arr陣列是升序排列的 for (int i=n-1;i>n-m;i--){ cout << arr[i] << " "; } return 0; } }