基數排序是對桶排序的乙個擴充套件,是乙個典型的以空間換時間的演算法,其演算法的實現附帶著額外的空間開銷
核心演算法如下:(圖上收集個位那裡19應該放到下標為9的桶,有誤)
我們需要借助10個桶來完成排序(可以用二維陣列,也可以用鍊錶陣列來實現)
以圖上待排序的陣列為例來說明這個演算法的實現過程
初始化10個桶,每個桶的容量為待排序陣列長度8,用二維陣列來實現演算法**(桶用二維陣列實現)陣列第一輪遍歷,取出各個元素的個位數,放入相應的桶: 135取出5,放入下標為5的桶中:
bucket[5] = 135
242取出2,bucket[2]=242
…陣列第一輪遍歷完成後,桶中已經存放了對應的元素
[,,,,,,,,,]
把這些桶中的元素按順序重新放回待排序陣列中,得到最新陣列為
清空每個桶中的元素
陣列第二遍遍歷,取出各個元素的十位數,放入相應的桶: 11取出1,
bucket[1] = 11
242取出4,bucket[4] = 242
192取出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,以個位數數字為桶編號依次入...