排序演算法 四 基數排序

2021-07-29 14:01:08 字數 1527 閱讀 7126

本篇部落格介紹基於順序表的實現 lsd,msd 兩種方式

基本思路:看排序陣列中最大值的位數,比如說最大值是999,就是三位 k1k2k3,先按k3掃瞄一遍陣列,分別記下k3位為0的個數,為1的個數,……為9的個數,用陣列coun[10]來記錄,再使用乙個陣列addr[10]來記錄每個桶的起始位置

舉個例子:

序列:278,109,063,930,589,184,505,269,008,083

0  1  2  3  4  5  6  7  8  9

count:1  0  0  2  1  1  0  0  2  3

addr :0  1  1  1  3  4  5  5  5  7

第一次排序(個位):以278為例addr[8] 為5,就把元素278放到陣列5號位置,然後把addr[8]++

(1)lsd:從最低位開始排序,迴圈上面的操作,把次高位排序,再把最高位排序。

**:

int getmaxbit(int *arr,size_t size) //獲取最大值的位數

} return count;

}void radixsortlsd(int *arr, size_t size) //按最低位開始排序

; for (size_t idx = 0; idx < size; ++idx)

int addr[10] = ;

for (size_t j = 1; j < 10; ++j)

//歸置元素,排序

for (size_t index = 0; index < size; ++index)

memcpy(arr, bucket, size*sizeof(bucket[0]));

radix *= 10;

} delete bucket;

}

(2) msd以最高位排序是乙個遞迴過程

①先把最高位排序,找出count陣列中大於1的。

②再對個數大於1的,再次進行此低位排序。直到最低位。

**中有解釋:

void _radixsortmsd(int *arr, size_t left, size_t right, int* bucket, int bit) //[)

; for (size_t idx = left; idx < right; ++idx)

int addr[10] = ;

for (size_t j = 1; j < 10; ++j)

//歸置元素,排序

for (size_t index = left; index < right; ++index)

memcpy(arr + left, bucket + left, (right - left)*sizeof(bucket[0]));

//掃瞄count桶中 查詢個數大於1的元素

size_t m = 0;

for (; m < 10; ++m) }

}void radixsortmsd(int *arr,size_t size)

排序演算法 基數排序

基數排序 思想 基數排序屬於 分配式排序 分為高位優先法msd和低位優先法lsd 低位優先法lsd 從最低位k0開始排序 對於排好的序列再用次低位k1排序 依次重複,直至對最高位kd 1排好序後,整個序列稱為有序的 這是乙個分 收 分 收 分 收的過程 特點 穩定 空間複雜度 o dn 時間複雜度 ...

排序演算法 基數排序

一 基數排序的思想 不直接比較數與數的大小。把待排序的整數按位分,分為個位,十位 從小到大依次將位數進行排序。實際上分為兩個過程 分配和收集。分配就是 從個位開始,按位數從小到大把資料排好,分別放進0 9這10個桶中 收集就是 依次將0 9桶中的資料放進陣列中 重複這兩個過程直到最高位 二 過程 比...

排序演算法 基數排序

基數排序稱桶排序。它按照記錄的各位值逐步進行排序。適用於整數型別的排序。基數排序不同於別的排序方法通過比較和交換來排序,它是通過按照桶來分配和收集的方法實現的。基本思想 假設待排序的記錄都是m位d進製 不足m位的高位補0 設定d個桶 0,1,d 1 首先將序列中的記錄按照最低位值的大小分配到各個桶中...