標籤:分配 實現 收集 相同 col pac www. stream 掃描
#include<iostream>#include<cstdlib>using namespace std;int getdigit(int x,int d){ int a[]={ 1,1,10 };//因為待排序數組最大是兩位元,所以到十位就好 return ((x/a[d])%10);//確定桶號}void PrintArr(int ar[],int n){ for(int i=0;i<n;i++) cout<<ar[i]<<" "; cout<<endl;}void msdradix_sort(int arr[],int begin,int end,int d){ const int radix=10; int count[radix],i,j; //置空 for(i=0;i<radix;++i) { count[i]=0; } //分配桶儲存空間 int *bucket=(int *)malloc((end-begin+1)*sizeof(int)); //統計各桶需要裝的元素數 for(i=begin;i<=end;++i) { count[getdigit(arr[i],d)]++; } //求出桶的便捷索引,count[i]值為第i個桶的右邊界索引+1 for(i=01;i<radix;++i) { count[i]=count[i]+count[i-1]; } //這裡要從右向左掃描,保證排序的穩定性 for(i=end;i>=begin;--i) { j=getdigit(arr[i],d);//求出關鍵碼的第d位元字,如576的第三位是5 bucket[count[j]-1]=arr[i];//放入對應的桶中,count[j]-1是第j個桶的右邊界索引 --count[j]; } //此時count[i]為第i個桶的左邊界 //從每個桶中收集資料 for(i=begin,j=0;i<=end;++i,++j) { arr[i]=bucket[j]; } //釋放儲存空間 free(bucket); //對每個桶中資料進行再排序 for(i=0;i<radix;i++) { int p1=begin+count[i];//第i個桶的左邊界 int p2=begin+count[i+1]-1;//第i個桶的有邊界 if(p1<p2&&d>1) { msdradix_sort(arr,p1,p2,d-1);//對第i個桶遞迴調用,進行基數排序,數位降1 } }}int main(){ int ar[]={ 12,24,54,23,54,76,97,45,23,65,87,34, }; int len=sizeof(ar)/sizeof(int); cout<<"排序前資料如下"<<endl; PrintArr(ar,len); msdradix_sort(ar,0,len-1,2); cout<<"排序後結果如下:"<<endl; PrintArr(ar,len);}
最高位優先法通常是一個遞迴的過程:
<1>先根據最高位關鍵碼K1排序,得到若干對象組,對象組中每個對象都有相同關鍵碼K1。
<2>再分別對每組中對象根據關鍵碼K2進行排序,按K2值的不同,再分成若干個更小的子組,每個子組中的對象具有相同的K1和K2值。
<3>依此重複,直到對關鍵碼Kd完成排序為止。
<4> 最後,把所有子組中的對象依次串連起來,就得到一個有序的對象序列。
from[http://www.cnblogs.com/Braveliu/archive/2013/01/21/2870201.html]
基數排序的msd實現c++