演算法 基數排序的實現

2021-10-09 07:22:11 字數 3343 閱讀 4632

基數排序是對桶排序的乙個擴充套件,是乙個典型的以空間換時間的演算法,其演算法的實現附帶著額外的空間開銷

核心演算法如下:(圖上收集個位那裡19應該放到下標為9的桶,有誤)

我們需要借助10個桶來完成排序(可以用二維陣列,也可以用鍊錶陣列來實現)

以圖上待排序的陣列為例來說明這個演算法的實現過程

初始化10個桶,每個桶的容量為待排序陣列長度8,用二維陣列來實現

陣列第一輪遍歷,取出各個元素的個位數,放入相應的桶: 135取出5,放入下標為5的桶中:bucket[5] = 135242取出2,bucket[2]=242

陣列第一輪遍歷完成後,桶中已經存放了對應的元素[,,,,,,,,,]

把這些桶中的元素按順序重新放回待排序陣列中,得到最新陣列為

清空每個桶中的元素

陣列第二遍遍歷,取出各個元素的十位數,放入相應的桶: 11取出1,bucket[1] = 11242取出4,bucket[4] = 242192取出9,bucket[9] = 192

第二遍遍歷結束後,把這些桶中的元素按順序重新放回待排序陣列中,得到最新陣列為

清空每個桶中的元素

陣列第三遍遍歷,取出各個元素的百位數… … 直到迴圈了最長位數(該陣列裡邊元素最長位數為百位,所以需要迴圈遍歷三次陣列)遍後陣列就有序了

演算法**(桶用二維陣列實現)

public

class

basenumbersortbyarray

public

static basenumbersortbyarray instance

(int

arr)

/** *

* @title: initbucket

* @description: 初始化桶和每個桶目前所存放的元素數量為0

* @param: @param length 每個桶的容量

* @return: void

*/private

static

void

initbucket

(int length)

/** *

* @title: getmaxlength

* @description: 獲取所有元素中位數的最大值

* @return: int 位數的最大值

*/private

intgetmaxlength()

return

(max +"")

.length()

;}/** *

* @title: basenumbersort

* @description: 基數排序入口

* @return: void

*/public

void

basenumbersort()

//2....

//按順序遍歷所有桶,將桶中的元素按順序取出放回原始陣列中

int k =0;

//遍歷桶元素存入原始陣列所使用的指向原始陣列的當前下標

//遍歷每個桶

for(

int ii =

0; ii < bucket_size; ii++

)//3...

//當前桶中元素的計數置為0

elementcount[ii]=0

;}}}

}

演算法**(桶用鍊錶陣列實現)

class

bucketnode

}public

class

basenumbersortbylinklist

public

static basenumbersortbylinklist instance

(int

arr)

private

static

void

initbucket()

}/**

* * @title: getendbucketnode

* @description: 獲得指定桶的最後乙個元素

* @param: @param index 指定的桶的下標

* @return: bucketnode 最後乙個元素

*/private bucketnode getendbucketnode

(int index)

/** *

* @title: basenumbersort

* @description: 基數排序入口

* @return: void

*/public

void

basenumbersort()

//2....

//按順序遍歷所有桶,將桶中的元素按順序取出放回原始陣列中

bucketnode bucketnode = null;

int k =0;

//遍歷桶元素存入原始陣列所使用的指向原始陣列的當前下標

//遍歷每個桶

for(

int ii =

0; ii < bucket_size; ii++

)//3...

//清空當前桶中的元素

clearbucket

(ii);}

}}/** *

* @title: clearbucket

* @description: 清空指定桶的所有元素

* @param: @param index 指定桶的下標

* @return: void

*/private

void

clearbucket

(int index)

/** *

* @title: getmaxlength

* @description: 獲取所有元素中位數的最大值

* @return: int 位數的最大值

*/private

intgetmaxlength()

return

(max +"")

.length();}}

時間複雜度:o(n*k)

空間複雜度:o(n+k)

穩定性:穩定

ps: n為資料規模, k為桶的個數

基數排序的缺點:

原始碼位址github位址

基數排序演算法

include stdafx.h include iostream include math.h using namespace std struct radixsort 建立迴圈鍊錶 radixsort creatlink else le ls ls new radixsort 為下乙個節點在堆記...

基數排序演算法

以下內容為程式 int quicksort int p,int n extern int insertsort int p,int n static int partition int p,int n,int m static int quick sort int p,int n 快速排序演算法在 ...

基數排序演算法

經典排序演算法 基數排序radix sort 原理類似桶排序,這裡總是需要10個桶,多次使用 首先以個位數的值進行裝桶,即個位數為1則放入1號桶,為9則放入9號桶,暫時忽視十位數 例如 待排序陣列 62,14,59,88,16 簡單點五個數字 分配10個桶,桶編號為0 9,以個位數數字為桶編號依次入...