一、題目
如何在O(n)時間內,對0到n^2-1之間的n個整數進行排序
二、思路把整數轉換為n進位再排序,每個數有兩位,每位的取值範圍是[0..n-1],再進行基數排序
三、代碼
#include <iostream>#include <cmath>using namespace std;int n, radix, length_A, digit = 2;void Print(int *A, int start, int end){int i;for(i = start; i <= end; i++){if(i == start)cout<<'{';else cout<<' ';cout<<A[i];}cout<<'}'<<endl;}//基數排序調用的穩定排序void Stable_Sort(int *A, int *B, int k, int d){int i, j;//將C數組初始化為0,用於計數int *C = new int[k+1];for(i = 0; i <= k; i++)C[i] = 0;int *D = new int[length_A+1];for(j = 1; j <= length_A; j++){//D[j]表示第[j]個元素的第i位元字D[j] = A[j] % (int)pow(radix*1.0, d) / (int)pow(radix*1.0, d-1);//C[j]表示數字D[j]在數組A中出現的次數C[D[j]]++;}//C[i]表示所以<=i的數字出現過的次數for(i = 1; i <= k; i++)C[i] = C[i] + C[i-1];//初始化B為0,B用於輸出排序結果for(i = 1; i <= length_A; i++)B[i] = 0;for(j = length_A; j >= 1; j--){//如果<=D[j]的數位個數是x,那麼排序後A[j]應該出現在第x個位置,即B[x]=A[j]B[C[D[j]]] = A[j];C[D[j]]--;}delete []C;delete []D;}//基數排序void Radix_Sort(int *A, int *B){int i, j;//依次對每一位進行排序,從低位到高位for(i = 1; i <= digit; i++){Stable_Sort(A, B, radix-1, i);//輸入的是A,輸出的是B,再次排序時要把輸出資料放入輸出資料中for(j = 1; j <= length_A; j++)A[j] = B[j];}}int main(){cin>>n;length_A = n;int *A = new int[n+1];int *B = new int[n+1];bool flag[1000] = {0};int i;//生產n個隨機的資料範圍在0到n^-1之間for(i = 1; i <= n; i++){do{A[i] = rand() % (n*n);}while(flag[A[i]]);flag[A[i]] = 1;}Print(A, 1, n);radix = n;Radix_Sort(A, B);Print(A, 1, n);return 0;}