基數排序 Radix Sort

2021-07-26 14:37:37 字數 1336 閱讀 7992

基數排序是在某種情況下比快速排序還快的排序.當然了,計數排序(counting sort)也有可能比快速排序快.

計數排序非常容易理解,時間複雜度是o(max(a[i])), 如果資料範圍很小的話,計數排序有巨大優勢.

而基數排序,則更進一步,對每一位進行計數排序.

這樣時間複雜度降為o(n*log(max(a[i]))

以下**實現了從小到大cntsort()和從大到小cntsort2().實際上也可以倒置得到從大到小,依然是o(n),**比較迷的地方就是output陣列,記住迴圈順序,這個比較巧妙,具體參見

#include 

using

namespace

std;

int idx(int x, int

exp)

void cntsort(int *a, int n, int

exp)

; int output[n];

for (int i = 0; i < n; i++) cnt[idx(a[i], exp)]++;

for (int i = 1; i < 10; i++) cnt[i] += cnt[i - 1];

for (int i = n - 1; i >= 0; i--)

for (int i = 0; i < n; i++) a[i] = output[i];

}void cntsort2(int *a, int n, int

exp)

; int output[n];

for (int i = 0; i < n; i++) cnt[idx(a[i], exp)]++;

for (int i = 8; i >= 0; i--) cnt[i] += cnt[i + 1];

for (int i = 0; i < n; i++)

for (int i = 0; i < n; i++) a[i] = output[i];

}int main()

for (int

exp = 1; mx / exp > 0; exp *= 10) cntsort(a, n, exp);

for (int i = 0; i < n; i++) cout

<< a[i] << ' ';

cout

<< endl;

for (int

exp = 1; mx / exp > 0; exp *= 10) cntsort2(a, n, exp);

for (int i = 0; i < n; i++)

cout

<< a[i] << ' ';

}

基數排序 RadixSort

基數排序 以整形為例 將整形10進製按每位拆分,然後從低位到高位依次比較各個位。主要分為兩個過程 1 分配,先從個位開始,根據位值 0 9 分別放到0 9號桶中 比如53,個位為3,則放入3號桶中 2 收集,再將放置在0 9號桶中的資料按順序放到陣列中 重複 1 2 過程,從個位到最高位 比如32位...

Radix sort 基數排序

有關 gpu並行程式設計 英文 cuda programming a developer s guide to parallel computing with gpus 第六章 中基數排序,其中並行排序的多執行緒排序,由於沒有具體較為詳細的介紹,對於初次接觸多執行緒的人略微困難。本文較為詳細的介紹此...

基數排序(radix sort)

基數排序的發明可以追溯到1887年赫爾曼何樂禮在打孔卡片製表機上的貢獻。實現原理 將所有待比較的正整數統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始進行基數字10的計數排序,一直到最高位計數排序完後,數列就變成了乙個有序數列 利用了計數排序的穩定性 include includeus...