基數排序和計數排序都屬於「非比較排序」,有關計數排序可檢視
基數排序介紹:基數排序(radix sort)屬於「分配式排序」(distribution sort),又稱「桶子法」(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用。按照排序的順序會被分為:最高位優先法和最低位優先法。以下實現的是最低位優先法(lsd)。基數排序是穩定排序,所謂穩定不穩定是說序列中相同元素經過排序後,他們的先後順序不變。
思路先按照最低位進行排序,接下來是次高位,一直到資料中最大的位數排序完。1、計算出陣列中最大的數字是幾位數;是幾位數我們在接下來的排序中最外層就會迴圈幾次;
2、開闢乙個「桶」以及用來臨時存放排序的陣列;「桶」只開闢十個int大小,因為十進位制下只有0-9十個數字,用來記錄資料的某一位對應數字出現的次數,(例如,3,23,那麼當個位數在進行排序時bucket[3] = 2);另開闢乙個n個元素的tmp陣列,用來暫時存放排序的結果;
3、每次最外層迴圈開始時,先將bucket陣列重新都置為0,計算出陣列中所有元素對應位(例,個位,十位,百位)出現的個數,並同步到bucket陣列中;
4、按照bucket陣列中的順序,將資料排序到tmp陣列中;
5、redix*=10,再進行下一輪的迴圈。
實現以及測試**如下:
#include
using
namespace
std;
//求陣列中最大數的位數
int getbitnum(int* arr, int n)
}return maxbitnum;
}void redix_sort(int* arr, int n)
//轉換為下標,方便一會用
for (int i = 1; i < 10; i++)
bucket[i] = bucket[i - 1] + bucket[i];
//重新排序陣列
for (int i = n - 1; i >= 0; i--)
//拷貝回原陣列,進行下一輪排序
for (int i = 0; i < n; i++)
arr[i] = tmp[i];
//準備下一位
redix *= 10;
}}int main()
; redix_sort(arr, sizeof(arr) / sizeof(arr[0]));
for (int i = 0; i < 10; i++)
cout
<< arr[i] << " ";
cout
<< endl;
system("pause");
return0;}
//輸出結果:2 6 14 28 39 43 55 73 81 93
圖示基數排序過程:
基數排序(桶排序)
1。什麼是基數排序 radix sort 基數排序 屬於分配式排序 distribution sort 又稱 桶排序 bucket sort 它是通過鍵值的各個位的值,將要排序的元素分配至某些 桶 中,達到排序的作用。2.它和歸併一樣,屬於穩定型演算法。public void radixsort i...
基數排序(桶排序)
思想 先把這組資料的個位排有序,再把十位排有序,再排百位 千位 include include include include void showarr int arr,int len printf n int getmaxnumfin int arr,int len 找陣列中最大數,並求出最大數的...
基數排序 桶排序
1.基數排序又稱桶排序,具體思想就是將數值當成陣列的下標儲存。2.將所有數值拿出個位來比較,例如值為m的就存入下標為m的陣列中。3.將比較後的陣列拿出即為按個位排序好的陣列,再將這個排序好的陣列按十位排序。4.比較完個十百千所有位數以後即排序完成。兩種 實現思路都是一樣的,實現方式1可直接改寫為c或...