基数排序

来源:互联网 发布:krpano100源码 授权码 编辑:程序博客网 时间:2024/06/07 02:52

基数排序(radix sort)

  • 真言

宿舍很冷,但是为了将来,什么苦都得忍着,忍方可成大事。

  • 主题

给一堆相同具有相同位数的数排序。这些数有一个共同的特点具有相同的位数。

  • 思路

举个例子呗,例子最好理解了。

比如有如下数据,{329,457,657,839,436,720,355}.这些数字都是三位的,也就是具有相同的位数。

我们知道,对于一位数字只能是从0~9里的一个,一共有十种可能,对于单位的数字我们可以用长度为十的哈希表(开放地址的链表)去存储数据,这样我们的数据就可以存起来了。

算法演示过程







时间复杂度(n*m),n为数据量,m为数字的位数。


  • 实验

程序结果截图

  • 代码(只供参考)


代码一年前写的,很水。。。

data.txt
[plain] view plain copy
print?
  1. 329/457/657/839/436/720/355/  
329/457/657/839/436/720/355/

test.cpp


[cpp] view plain copy
print?
  1. #include <iostream>  
  2. #include <fstream>  
  3. #include <math.h>  
  4. using namespace std ;  
  5.   
  6.   
  7. int const size = 7;  
  8. int const bit = 3 ;  
  9.   
  10. class radix_sort  
  11. {  
  12.     int  Aint ;  
  13.   
  14. public:  
  15.     // function:构造函数;  
  16.     radix_sort(void);  
  17.     // function:get data from file;  
  18.     void dataReader();  
  19.     // function:sort the data;  
  20.     void sort();  
  21.     // function:show the data;  
  22.     void datashow();  
  23.     // line is the line num;  
  24.     void tableinert(int (&T)[10][size],int line,int data);  
  25.     // function: save data out to file;  
  26.     void datasave();  
  27.     // function:析构函数;  
  28.     ~radix_sort(void);  
  29. };  
  30.   
  31.   
  32. // function:构造函数;  
  33. radix_sort::radix_sort(void)  
  34. {  
  35.     Aint = new int[size] ;  
  36.   
  37. }  
  38.   
  39. // function:get data from file;  
  40. void radix_sort::dataReader()  
  41. {  
  42.     ifstream fileReader ;  
  43.     fileReader.open(”data.txt”);  
  44.   
  45.     int i= 0 ;  
  46.     char c;  
  47.     while(i<size)  
  48.     {  
  49.         fileReader>>Aint[i]>>c;  
  50.         i++;  
  51.     }  
  52.   
  53.     cout<<”read over ”<<endl;  
  54.     fileReader.close();  
  55. }  
  56.   
  57. // function:sort the data;  
  58. void radix_sort::sort()  
  59. {  
  60.     int  table[10][size] ;  
  61.     int i,j ;  
  62.     for(i = 0 ;i<10;i++)  
  63.         for(j = 0 ; j<size;j++)  
  64.         {  
  65.             // mark null  
  66.             table[i][j] = -1;  
  67.         }  
  68.   
  69.   
  70.   
  71.         j=1;  
  72.         int mod ;  
  73.         int k;  
  74.         int num ;  
  75.         while(j<bit+1)  
  76.         {  
  77.             //the data is saved to table;  
  78.             for( i = 0 ;i< size;i++ )   
  79.             {  
  80.                 mod = Aint[i]%int ( pow(10.0,j) )   ;  
  81.                 mod = mod /int ( pow(10.0,j-1) )   ;  
  82.                 // var mode : get the bit;  
  83.                 this->tableinert(table,mod,Aint[i]);  
  84.             }  
  85.   
  86.             i = 0 ;  
  87.             // use time to get space;  
  88.             // table is saved to Aint;  
  89.             for( k = 0; k<10;k++)   
  90.             {  
  91.                 num = 0;  
  92.                 while(table[k][num] != -1)  
  93.                 {  
  94.                     Aint[i++]=table[k][num] ;  
  95.                     table[k][num] = -1 ;  
  96.                     num++;  
  97.                 }  
  98.             }  
  99.             cout<<”the first time:”<<endl;  
  100.             this->datashow();  
  101.             if(i!= size)   
  102.             {  
  103.                 cout<<”error”<<endl;          
  104.             }  
  105.   
  106.             j++;  
  107.         }  
  108.   
  109. }  
  110.   
  111. // function:show the data;  
  112. void radix_sort::datashow()  
  113. {  
  114.     int i =0 ;  
  115.     cout<<”data follows”<<endl;  
  116.     while(i<size)  
  117.     {  
  118.         cout<<Aint[i]<<endl;  
  119.         i++ ;  
  120.     }  
  121.     cout<<”show over”<<endl;  
  122. }  
  123.   
  124.   
  125. // line is the line num;  
  126. void radix_sort::tableinert(int (& T)[10][size],int line,int data)  
  127. {  
  128.     int i = 0 ;  
  129.     while(i<size)  
  130.     {  
  131.         // if now space is NULL, so put it in  
  132.         if(T[line][i] == -1 )  
  133.         {  
  134.             T[line][i] = data;  
  135.             break;  
  136.         }  
  137.         i++;  
  138.     }  
  139. }  
  140.   
  141.   
  142. // function: save data out to file;  
  143. void radix_sort::datasave()  
  144. {  
  145.     ofstream fileWriter;  
  146.     fileWriter.open(”sorteddata.txt”);  
  147.     fileWriter.clear();  
  148.   
  149.     int i = 0;  
  150.     while(i<size)  
  151.     {  
  152.         fileWriter<<Aint[i]<<”/”;  
  153.         i++;  
  154.     }  
  155.     cout<<”save over”<<endl;  
  156.     fileWriter.close();  
  157.   
  158.   
  159. }  
  160.   
  161. // function:析构函数;  
  162. radix_sort::~radix_sort(void)  
  163. {  
  164.     delete [] Aint ;  
  165. }  
  166.   
  167. int main()  
  168. {  
  169.     radix_sort   RS = new radix_sort() ;  
  170.     RS->dataReader();  
  171.     RS->datashow();  
  172.     RS->sort();  
  173.     RS->datasave();  
  174.   
  175.     delete RS ;  
  176.     system(”pause”);  
  177.     return 0;  
  178. }  

原创粉丝点击