基数排序

 

 

  1 #include<iostream>
  2 #include<string>
  3 using namespace std;
  4 //数值型基数排序
  5 int getDigit(int num, int index)
  6 {
  7     int mod = 1;
  8     while (index)
  9     {
 10         mod *= 10;
 11         index--;
 12     }
 13     int div = mod / 10;
 14     return num%mod / div;
 15 
 16 }
 17 
 18 void Count_Sort(int *A, int *B, int len, int k,int d)
 19 {
 20     int count = k + 1;
 21     int *C = new int[count];
 22     for (int i = 0; i < count; i++)
 23     {
 24         C[i] = 0;
 25     }
 26     for (int i = 0; i < len; i++)
 27     {
 28         C[getDigit(A[i], d)] = C[getDigit(A[i], d)] + 1;
 29     }
 30     for (int i = 1; i < count; i++)
 31         C[i] = C[i] + C[i - 1];
 32     for (int i = len-1; i >=0; i--)
 33     {
 34         B[C[getDigit(A[i], d)] - 1] = A[i];
 35         C[getDigit(A[i], d)] = C[getDigit(A[i], d)] - 1;
 36     }
 37 }
 38 void RADIX_SORT(int *A, int d,int len)
 39 {
 40     for (int i = 1; i <=d; i++)
 41     {
 42         int *B = new int[len];
 43         Count_Sort(A, B, len, 10,i);
 44         for (int i = 0; i < len; i++)
 45         {
 46             A[i] = B[i];
 47         }
 48     }
 49 }
 50 //字符型基数排序
 51 int getAlpha(string A, int index)
 52 {
 53     return (A[A.length()-index]-'a');
 54 }
 55 void Count_SortAlpha(string*A, string*B, int len, char k, int d)
 56 {
 57     int count = (k-'a' + 1);
 58     int *C = new int[count];
 59     for (int i = 0; i < count; i++)
 60     {
 61         C[i] = 0;
 62     }
 63     for (int i = 0; i < len; i++)
 64     {
 65         C[getAlpha(A[i], d)] = C[getAlpha(A[i], d)] + 1;
 66     }
 67     for (int i = 1; i < count; i++)
 68         C[i] = C[i] + C[i - 1];
 69     for (int i = len - 1; i >= 0; i--)
 70     {
 71         B[C[getAlpha(A[i], d)]-1 ] = A[i];
 72         C[getAlpha(A[i], d)] = C[getAlpha(A[i], d)] - 1;
 73     }
 74 }
 75 void RADIX_SORTAlpha(string A[], const int d, const int len)
 76 {
 77     for (int i = 1; i <= d; i++)
 78     {
 79         string *B=new string[len];
 80         Count_SortAlpha(A, B, len, 'z', i);
 81         for (int i = 0; i < len; i++)
 82         {
 83             A[i] = B[i];
 84         }
 85         delete[] B;
 86     }
 87 }
 88 
 89 int main()
 90 {
 91 
 92     
 93         int A[] = { 329,457,657,839,436,720,355,0,12,15,105 };     
 94         int N = sizeof A / sizeof A[0];
 95         RADIX_SORT(A, 3, N);
 96         for (int i = 0; i<N; i++)
 97         {
 98             cout << A[i] << "  ";
 99         }
100         cout << "\n";
101 
102         string Alpha[] = { "cow", "sea", "rug", "row","mob","box","tab","bar","tar","dig","big","tea","now","fox" };
103 
104         N = sizeof Alpha / sizeof Alpha[0];
105         RADIX_SORTAlpha(Alpha, 3, N);
106         for (int i = 0; i < N; i++)
107         {
108             cout << Alpha[i] << "  ";
109         }
110         cout << "\n";
111 
112         return 0;
113     
114 
115 
116 }

 

posted @ 2015-04-03 08:13  liuhg  阅读(411)  评论(0编辑  收藏  举报