《算法导论》 8.3 基数排序

来源:互联网 发布:windows网络编程教程 编辑:程序博客网 时间:2024/04/30 00:20

基数排序:是一种用在老式穿卡机上的算法。一张卡片有80列,每一列可以在12个位置中的任一处穿孔。排序器可以被机械地“程序化”,以便对一叠卡片中的每一列进行检查,再根据穿孔的位置将它们分放入12个例子里。这样,操作员就可以逐个地将它们收集起来,其中第一个位置穿孔的放在最上面,第二个位置穿了孔的其次,等等

对十进制数字来说,系列中只用到10个位置。一个d位数占用d个列。因为卡片排序器一次只能查看一个列,因此,要对n张卡片上的d倍数进行排序,就需要用到排序算法。

基数排序算法的代码是很直观的。在下面的过程中,假设长度为n的数组A中,每个元素都有d位数字,其中第一位是最低位,第d位是最高位。

RADIX-SORT(A, d)

 for i ← 1 to d     do use a stable sort to sort array A on digit i


 

在C++实现中,我使用了一个辅助的函数 int maxDigit(int* arr,int digit)来计算待排序数组中最大的数位,以使程序有更大的适用范围,不需要待排序的数字位数相同。

基数排序的算法很直观。在一个数组中,每个元素都有d位数字,其中第1位是最低位,第d位是最高位。依次判断每个位置的排序。基数排序需要另一种稳定的排序算法(stable sort)进行辅助。

#include <iostream>  using namespace std;  //求数组中数字的最大位数 int maxDigit(int* arr,int digit) {     int n = 0;     int* temp = new int[digit];     for(int i = 0; i < digit; i++)         temp[i]= arr[i];     for(int i = 0; i < digit; i++)     {         int counter =1;         while(temp[i] / 10 > 0)         {             counter++;             temp[i] /= 10;         }         if(n < counter)             n = counter;//找位置最大值。     }     delete[] temp;     return n; }  //基数排序 void radixSort(int* arr, int digit) {     int n = maxDigit(arr, digit);     int* temp = new int[digit];     int* count = new int[10];     int i, j, k;     int radix = 1;     for(i = 1; i <= n; i++)     {         for(j = 0; j < 10; j++)             count[j] = 0;         for(j = 0; j < digit; j++)         {             k = (arr[j] / radix) % 10;             count[k]++;         }         for(j = 1; j < 10; j++)//以下是用计数排序法进行重新排序的过程。。排序算法。。。                      count[j] = count[j-1] + count[j];         for(j = digit - 1; j >= 0; j--)         {             k = (arr[j] / radix) % 10;             count[k]--;             temp[count[k]] = arr[j];         }         for(j = 0; j < digit; j++)             arr[j] = temp[j];         radix *= 10;     }     delete[] temp;     delete[] count; }  int main() {     int a[] = {22, 34, 95, 87, 56, 980, 12, 48};     radixSort(a, 8);     for(int i = 0; i < 8; i++)     {         cout << a[i] << " ";     }     cout << endl;     return 0; }


 

原创粉丝点击