您好,登錄后才能下訂單哦!
使用c語言怎么實現基數排序?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
1.基數排序(radixsort)屬于“分配式排序”(distributionsort),又稱“桶子法”(bucketsort)或binsort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些“桶”中,藉以達到排序的作用。
2.基數排序的實現方法分為兩種:
最高位優先(MostSignificantDigitfirst)法,簡稱MSD法:先按k1排序分組,同一組中記錄,關鍵碼k1相等,再對各組按k2排序分成子組,之后,對后面的關鍵碼繼續這樣的排序分組,直到按最次位關鍵碼kd對各子組排序后。再將各組連接起來,便得到一個有序序列。
最低位優先(LeastSignificantDigitfirst)法,簡稱LSD法:先從kd開始排序,再對kd-1進行排序,依次重復,直到對k1排序后便得到一個有序序列。
3.LSD基數排序的原理及代碼實現如下:
第一步
假設原來有一串數值如下所示:
73,22,93,43,55,14,28,65,39,81
首先根據個位數的數值,在走訪數值時將它們分配至編號0到9的桶子中:
0
1 81
2 22
3 73 93 43
4 14
5 55 65
6
7
8 28
9 39
第二步
接下來將這些桶子中的數值重新串接起來,成為以下的數列:
81,22,73,93,43,14,55,65,28,39
接著再進行一次分配,這次是根據十位數來分配:
0
1 14
2 22 28
3 39
4 43
5 55
6 65
7 73
8 81
9 93
第三步
接下來將這些桶子中的數值重新串接起來,成為以下的數列:
14,22,28,39,43,55,65,73,81,93
這時候整個數列已經排序完畢;如果排序的對象有三位數以上,則持續進行以上的動作直至最高位數為止。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int getDigitNum(int x){ if(x == 0) return 1; int res = 0; while(x){ res ++; x /= 10; } return res; } void RadixSort(int data[], int n){ //find the Maximum and its digit number int Max = data[0]; for(int i = 1; i < n; i++){ if(Max < data[i]) Max = data[i]; } int maxNum = getDigitNum(Max); //maxNum times radix sort int divisor = 1; for(int k = 0; k < maxNum; k++){ vector<int> g[10];//g[i]中包含了"末位"數字是i的data[]數組中的元素 for(int i = 0; i < 10; i++) g[i].clear(); for(int i = 0; i < n; i++){ int tmp = data[i] / divisor % 10; g[tmp].push_back(data[i]); } int cnt = 0; for(int i = 0; i < 10; i++){ for(int j = 0; j < g[i].size(); j++){ data[cnt++] = g[i][j]; } } divisor *= 10; } } int main(){ int Array[10] = {73,22,93,43,55,14,28,65,39,81}; RadixSort(Array, 10); for(int i = 0; i < 10; i++){ printf("%d ", Array[i]); } printf("\n"); return 0; }
看完上述內容,你們掌握使用c語言怎么實現基數排序的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。