標籤:統計 索引 const max space 結果 eof mil sizeof
#include<iostream>#include<cstdlib>using namespace std;const int MAXSIZE=10000;int getdigit(int x,int d){ int a[]={ 1,1,10,100 }; return (x/a[d])%10;}void PrintArr(int ar[],int n){ for(int i=0;i<n;++i) { cout<<ar[i]<<" "; } cout<<endl;}void lsdradix_sort(int arr[],int begin,int end,int d){ const int radix=10; int count[radix],i,j; int *bucket=(int*)malloc((end-begin+1)*sizeof(int));//所有桶的空間開闢 //按照分配標準依次進行排序過程 for(int k=1;k<=d;++k) { //置空 for(i=0;i<radix;++i) { count[i]=0; } //統計各個桶中所盛資料個數 for(i=begin;i<=end;++i) { count[getdigit(arr[i],k)]++; } //count[i]表示第i個桶的右邊界索引 for(i=1;i<radix;i++) { count[i]=count[i]+count[i-1]; } //把資料依次裝入桶(裝入時候注意分配技巧) for(i=end;i>=begin;--i)//從右向左掃描,保證排序穩定性 { j=getdigit(arr[i],k);//求出關鍵碼的第k位元字,例如576的第3位是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);}int main(){ int br[10]={ 23,34,54,67,3,76,2,87,25,76 }; cout<<"中繼資料如下:"<<endl; PrintArr(br,10); lsdradix_sort(br,0,9,3); cout<<"排序後資料如下:"<<endl; PrintArr(br,10);}
最低位優先法首先依據最低位關鍵碼Kd對所有對象進行一趟排序,
再依據次低位關鍵碼Kd-1對上一趟排序的結果再排序,
依次重複,直到依據關鍵碼K1最後一趟排序完成,就可以得到一個有序的序列。
使用這種排序方法對每一個關鍵碼進行排序時,不需要再分組,而是整個對象組。
from[http://www.cnblogs.com/Braveliu/archive/2013/01/21/2870201.html]
基數排序的lsd實現c++