排序演算法之基數排序

2021-07-03 22:01:51 字數 1312 閱讀 7628

首先從多排序碼排序開始介紹基數排序。以撲克牌排序為例。每張撲克牌有兩個「排序碼」:花色和面值。其有序關係為:

如果把所有撲克牌排成以下次序:

♣2,…,♣a,♦2,…,♦a,♥2,…,♥a,♠2,…,♠a

這就是多排序碼排序。排序後形成的有序序列叫做字典有序序列。

一般情況下,假定有乙個n個元素的序列{v

0,v1

,...

,vn−

1},且每個元素vi

中含有d 個排序碼(k

1,k2

,...

,kd)

。 實現多排序碼排序有兩種常用的方法:一種方法是最高位優先(most significant digit first,msd),一種方法是最低位優先(least significant digit first,lsd)。

首先根據最高位關鍵碼k1

得到若干物件組,物件組中的每個物件都有物件都有相同的關鍵碼k1;再分別對每組中的物件根據關鍵碼k2

進行排序,按k2值的不同,再分成若干個更小的子組,子組中的物件具有相同的k1

和k2 值;依次重複,直到對關鍵碼kd

完成排序為止。最後,把所有子組中的物件依次連線起來,就得到乙個有序的物件序列。

private

int radix = 10;//基數,預設十進位制

private

void

msdradixsort(int a, int left, int right, int d)

//從輔助陣列順序寫入原陣列

for (i = left, j = 0; i <= right; i++, j++)

a[i] = auxarray[j];

//按桶遞迴對d-1位處理

for (j = 0; j < radix - 1; j++)

}}

首先依據最低位排序碼kd

對所有元素進行一趟排序,然後依據次低位排序碼kd

−1對上一趟排序的結果再排序,依次重複,直到依據排序碼k1

最後一趟排序完成,就可以得到乙個有序的序列。使用這種排序方法對每個排序碼進行排序時,不需要再分組,而是整個元素組都參加排序。

private

void

lsdradixsort(int a, int left, int right, int d)

// 從輔助陣列順序寫入原陣列

for (i = left, j = 0; i <= right; i++, j++)

a[i] = auxarray[j];

}}

演算法 排序之基數排序

基數排序也是穩定的內排序。因為它的實現是基於內部使用了穩定的排序實現的所以基數排序整體是穩定的,而且時間複雜度為o n 舉個例子 現在我們將一些3 多 位數排序,如果你說直接判斷就好的話,那你就太天真了,因為那就又變成看o nlgn 或者o n 如何能降低時間複雜度變成o n 呢?那就要使用線性時間...

排序演算法之基數排序

如果我們要排序的資料具有多個關鍵字域,那就可以採用基數排序的方法了。基數排序的主要思想是 假如參加排序的元素最高具有d位,有的數沒有d位那麼多,則在其欠缺的高位補0,將元素先按最低位 設最右邊的位為最低位 的值進行排序,然後按次低位進行排序.最後進行最高位的排序。基數排序如果想達到理想的目的,必須滿...

排序演算法之基數排序

基於排序是一種很特別的排序方法,它採用多關鍵字排序思想 即基於關鍵字各位的大小進行排序 借助 分配 和 收集 兩種操作對單邏輯關鍵字進行排序。基數排序又分為最高位優先 msd 和最低位優先 lsd 排序。基數排序 public void sort int array 建立乙個二維陣列 listque...