理论基础 —— 排序 —— 基数排序
生活随笔
收集整理的這篇文章主要介紹了
理论基础 —— 排序 —— 基数排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【概述】
?基數排序是一種穩定的排序方法,屬于非比較類排序,其基本思想是:將待排序序列分到有限數量的桶中,每個桶再個別排序。
簡單來說,就是將數據分組,放在一個個桶中,然后對每組每個桶再進行排序。
【過程】
例如:要對大小為 [1..1000] 范圍內的 n 個整數 A[1..n] 排序
首先,可以把桶設為大小為 10 的范圍,具體而言,設集合 B[1] 存儲 [1..10] 的整數,集合 B[2] 存儲 ? (10..20] 的整數,……,集合 B[i] 存儲 ((i-1)*10,?i*10] 的整數,i=1,2,..100,總共有 100 個桶。
然后,對 A[1..n] 從頭到尾掃描一遍,把每個 A[i] 放入對應的桶 B[j] 中,再對這 100 個桶中每個桶里的數字排序,這時可用冒泡,選擇,乃至快排,一般來說任何排序法都可以。
最后,依次輸出每個桶里面的數字,且每個桶中的數字從小到大輸出,這樣就得到所有數字排好序的一個序列了。
【源程序】
int getDigitInPos(int num,int pos){//找到數字num的從第到高的第pos位數據int temp=1; for(int i=0;i<pos-1;i++) temp*=10; return (num/temp)%10; } #define RADIX 10//基數為10,需要十個桶 #define KEYNUM 10//關鍵字位數,這里為整形位數 void RadixSort(int a[], int n){int *b[RADIX];//分別為0~9基數的存放空間 for (int i=0;i<10;i++){ b[i]=(int *)malloc(sizeof(int)*(dataNum + 1)); b[i][0]=0;//index為0處記錄這組數據的個數 } for(int pos=1;pos<=KEYNUM;pos++){//從個位開始入桶并出桶for(int i=0;i<n;i++){//分配過程 int num=getDigitInPos(a[i],pos); int index=++b[num][0]; b[num][index]=a[i]; } for(int i=0,j=0;i<RADIX;i++){//收集 for(int k=1;k<=radixArrays[i][0];k++) a[j++]=b[i][k]; b[i][0]=0;//出桶完畢,復位 } } }?
總結
以上是生活随笔為你收集整理的理论基础 —— 排序 —— 基数排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cow Contest(POJ-3660
- 下一篇: A+B Problem(高精)(洛谷-P