演算法導論8.3-4 O(n)時間內對[0..n^-1]之間的n個數排序

來源:互聯網
上載者:User
一、題目

如何在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;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.