基数排序(radix sort)
- 真言
宿舍很冷,但是为了将来,什么苦都得忍着,忍方可成大事。
- 主题
给一堆相同具有相同位数的数排序。这些数有一个共同的特点具有相同的位数。
- 思路
举个例子呗,例子最好理解了。
比如有如下数据,{329,457,657,839,436,720,355}.这些数字都是三位的,也就是具有相同的位数。
我们知道,对于一位数字只能是从0~9里的一个,一共有十种可能,对于单位的数字我们可以用长度为十的哈希表(开放地址的链表)去存储数据,这样我们的数据就可以存起来了。
算法演示过程
时间复杂度(n*m),n为数据量,m为数字的位数。
- 实验
程序结果截图
- 代码(只供参考)
代码一年前写的,很水。。。
data.txt329/457/657/839/436/720/355/
test.cpp
#include <iostream> #include <fstream> #include <math.h> using namespace std ; int const size = 7; int const bit = 3 ; class radix_sort { int * Aint ; public: // function:构造函数; radix_sort(void); // function:get data from file; void dataReader(); // function:sort the data; void sort(); // function:show the data; void datashow(); // line is the line num; void tableinert(int (&T)[10][size],int line,int data); // function: save data out to file; void datasave(); // function:析构函数; ~radix_sort(void); }; // function:构造函数; radix_sort::radix_sort(void) { Aint = new int[size] ; } // function:get data from file; void radix_sort::dataReader() { ifstream fileReader ; fileReader.open("data.txt"); int i= 0 ; char c; while(i<size) { fileReader>>Aint[i]>>c; i++; } cout<<"read over "<<endl; fileReader.close(); } // function:sort the data; void radix_sort::sort() { int table[10][size] ; int i,j ; for(i = 0 ;i<10;i++) for(j = 0 ; j<size;j++) { // mark null table[i][j] = -1; } j=1; int mod ; int k; int num ; while(j<bit+1) { //the data is saved to table; for( i = 0 ;i< size;i++ ) { mod = Aint[i]%int ( pow(10.0,j) ) ; mod = mod /int ( pow(10.0,j-1) ) ; // var mode : get the bit; this->tableinert(table,mod,Aint[i]); } i = 0 ; // use time to get space; // table is saved to Aint; for( k = 0; k<10;k++) { num = 0; while(table[k][num] != -1) { Aint[i++]=table[k][num] ; table[k][num] = -1 ; num++; } } cout<<"the first time:"<<endl; this->datashow(); if(i!= size) { cout<<"error"<<endl; } j++; } } // function:show the data; void radix_sort::datashow() { int i =0 ; cout<<"data follows"<<endl; while(i<size) { cout<<Aint[i]<<endl; i++ ; } cout<<"show over"<<endl; } // line is the line num; void radix_sort::tableinert(int (& T)[10][size],int line,int data) { int i = 0 ; while(i<size) { // if now space is NULL, so put it in if(T[line][i] == -1 ) { T[line][i] = data; break; } i++; } } // function: save data out to file; void radix_sort::datasave() { ofstream fileWriter; fileWriter.open("sorteddata.txt"); fileWriter.clear(); int i = 0; while(i<size) { fileWriter<<Aint[i]<<"/"; i++; } cout<<"save over"<<endl; fileWriter.close(); } // function:析构函数; radix_sort::~radix_sort(void) { delete [] Aint ; } int main() { radix_sort * RS = new radix_sort() ; RS->dataReader(); RS->datashow(); RS->sort(); RS->datasave(); delete RS ; system("pause"); return 0; }