基数排序法与我们之前讨论的排序法不太一样,并不需要进行元素之间的比较操作,而是属于一种分配模式排序方式。
基数排序法比较的方向可分为最高位优先(Most Significant Digit First,MSD)和最低位优先(Least Significant Digit First,LSD)两种。MSD是从最左边的位数开始比较的,而LSD则是从最右边的位数开始比较的。
,k是原始数据的最大值。
,n是原始数据的个数,p是数据字符数。- #include
- #include
- using namespace std;
-
- void PrintData(int data[], int size) {
- for (int i = 0; i < size; i++) {
- cout << data[i] << " ";
- }
- cout << endl;
- }
-
- void SetData(int data[], int size) {
- srand(time(nullptr));
- for (int i = 0; i < size; i++) {
- data[i] = rand() % 999 + 1;
- }
- }
-
- void Radix(int data[], int size) {
- for (int n = 1; n <= 100; n *= 10) {
- int temp[10][100] = { 0 };
- for (int i = 0; i < size; i++) {
- int m = (data[i] / n) % 10;
- temp[m][i] = data[i];
- }
-
- int k = 0;
- for (int i = 0; i < 10; i++) {
- for (int j = 0; j < size; j++) {
- if (temp[i][j] != 0) {
- data[k] = temp[i][j];
- k++;
- }
- }
- }
- cout << "经过" << setw(3) << n << "位排序后:";
- PrintData(data, size);
- }
- }
-
- int main() {
-
- int size = 20;
- int* data = new int[size];
- SetData(data, size);
- cout << "原始数据:";
- PrintData(data, size);
- cout << "---------------------------------" << endl;
- Radix(data, size);
- cout << "---------------------------------" << endl;
- cout << "最终数据:";
- PrintData(data, size);
- return 0;
- }
输出结果
