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

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

如何在O(n)時間內,對0到n^2-1之間的n個整數進行排序

 

二、思路把整數轉換為n進位再排序,每個數有兩位,每位的取值範圍是[0..n-1],再進行基數排序

 

三、代碼 [cpp]
view plaincopyprint?
  1. #include <iostream>   
  2. #include <cmath>   
  3. using namespace std;  
  4.   
  5. int n, radix, length_A, digit = 2;  
  6. void Print(int *A, int start, int end)  
  7. {  
  8.     int i;  
  9.     for(i = start; i <= end; i++)  
  10.     {  
  11.         if(i == start)cout<<'{';  
  12.         else cout<<' ';  
  13.         cout<<A[i];  
  14.     }  
  15.     cout<<'}'<<endl;  
  16. }  
  17. //基數排序調用的穩定排序   
  18. void Stable_Sort(int *A, int *B, int k, int d)  
  19. {  
  20.     int i, j;  
  21.     //將C數組初始化為0,用於計數   
  22.     int *C = new int[k+1];  
  23.     for(i = 0; i <= k; i++)  
  24.         C[i] = 0;  
  25.     int *D = new int[length_A+1];  
  26.     for(j = 1; j <= length_A; j++)  
  27.     {  
  28.         //D[j]表示第[j]個元素的第i位元字   
  29.         D[j] = A[j] % (int)pow(radix*1.0, d) / (int)pow(radix*1.0, d-1);  
  30.         //C[j]表示數字D[j]在數組A中出現的次數   
  31.         C[D[j]]++;  
  32.     }  
  33.     //C[i]表示所以<=i的數字出現過的次數
      
  34.     for(i = 1; i <= k; i++)  
  35.         C[i] = C[i] + C[i-1];  
  36.     //初始化B為0,B用於輸出排序結果   
  37.     for(i = 1; i <= length_A; i++)  
  38.         B[i] = 0;  
  39.     for(j = length_A; j >= 1; j--)  
  40.     {  
  41.         //如果<=D[j]的數位個數是x,那麼排序後A[j]應該出現在第x個位置,即B[x]=A[j]
      
  42.         B[C[D[j]]] = A[j];  
  43.         C[D[j]]--;  
  44.     }  
  45.     delete []C;  
  46.     delete []D;  
  47. }  
  48. //基數排序   
  49. void Radix_Sort(int *A, int *B)  
  50. {  
  51.     int i, j;  
  52.     //依次對每一位進行排序,從低位到高位   
  53.     for(i = 1; i <= digit; i++)  
  54.     {  
  55.         Stable_Sort(A, B, radix-1, i);  
  56.         //輸入的是A,輸出的是B,再次排序時要把輸出資料放入輸出資料中
      
  57.         for(j = 1; j <= length_A; j++)  
  58.             A[j] = B[j];  
  59.     }  
  60. }  
  61.   
  62. int main()  
  63. {  
  64.     cin>>n;  
  65.     length_A = n;  
  66.     int *A = new int[n+1];  
  67.     int *B = new int[n+1];  
  68.     bool flag[1000]  = {0};  
  69.     int i;  
  70.     //生產n個隨機的資料範圍在0到n^-1之間   
  71.     for(i = 1; i <= n; i++)  
  72.     {  
  73.         do  
  74.         {  
  75.             A[i] = rand() % (n*n);  
  76.         }while(flag[A[i]]);  
  77.         flag[A[i]] = 1;  
  78.     }  
  79.     Print(A, 1, n);  
  80.     radix = n;  
  81.     Radix_Sort(A, B);  
  82.     Print(A, 1, n);  
  83.     return 0;  
  84. }  

轉載自:http://blog.csdn.net/mishifangxiangdefeng/article/details/7685839

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.