排序 基數排序

2021-10-24 16:23:55 字數 4005 閱讀 7201

1、基數排序(桶排序)介紹

(1)基數排序(radix sort)屬於「分配式排序」(distribution sort),又稱「桶子法」(bucket sort)或bin sort,顧名思義,它是通過鍵值的各個位的值,將要排序的元素分配至某些「桶」中,達到排序的作用

(2)基數排序法是屬於穩定性的排序,基數排序法的是效率高的穩定性排序法

(3)基數排序(radix sort)是桶排序的擴充套件

(4)基數排序是2023年赫爾曼·何樂禮發明的。它是這樣實現的:將整數按位數切割成不同的數字,然後按每個位數分別比較。

2、基數排序基本思想

(1)將所有待比較數值統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後, 數列就變成乙個有序序列。

(2)將陣列 使用基數排序, 進行公升序排序。

第1輪排序  [按照個位排序]: 說明:事先準備10個陣列(10個桶),0-9 分別對應位數的 0-9

(a) 將各個數,按照個位大小放入到對應的各個陣列中

(b) 然後從 0-9 個陣列/桶,依次按照加入元素的先後順序取出

第1輪排序後:542、53、3、14、214、748

第2輪排序  [按照十位排序]

(1) 將各個數,按照十位大小放入到對應的各個陣列中

(2)  然後從 0-9 個陣列/桶,依次按照加入元素的先後順序取出

第2輪排序後: 3、14、214、542、748、53

第3輪排序  [按照百位排序]

(1) 將各個數,按照百位大小放入到對應的各個陣列中

(2)  然後從 0-9 個陣列/桶,依次按照加入元素的先後順序取出

第3輪排序後:3、14、53、214、542、748

排序完成。這裡可以明顯看出排序次數和最大數的位數有關。

3、**實現

第一輪

//定義二維陣列,表示10個桶,每個桶就是乙個一維陣列

//1、二維陣列包含10個一位陣列,

//2、防止在放數溢位,把每個一維陣列的大小(桶的大小)設定arr.length

//3、基數排序是用空間換時間的經典演算法

int bucket = new int [10][arr.length];

//為了記錄每個桶中實際存放了多少數量,定義乙個一位陣列來記錄各個桶每次放入的資料個數

//可以理解:bucketelementcounts[0]記錄的就是bucket[0]桶的放入資料的個數

int bucketelementcounts =new int[10];

//第一輪排序(針對每個元素的個位進行排序)

for(int j=0;j(1)這裡難理解是二維陣列bucket的意義。例如bucket[3][4]就表示的是原陣列中個位數是3的數共有4個。

//取出每個元素的個位

int digitofelement = arr[j] % 10;

//放入到對應的桶中

//二維陣列bucket的digitofelement變數就對應桶號

//二維陣列bucket的bucketelementcounts[digitofelement]就代表digitofelement桶存放的資料的個數

bucket[digitofelement][bucketelementcounts[digitofelement]] = arr[j];

bucketelementcounts[digitofelement]++;

(2)對於這三行**,先拿到元素的個位數,然後將原資料放到其個位數對應的二維陣列中,bucketelementcounts[digitofelement]對應的是個位數為digitofelement的數量。(3)這裡有乙個處理,就是將計數置為0,(bucketelementcounts[k] = 0;)這個為了在第二輪處理十位數的時候,從0開始計數。

第二輪

for(int j=0;j第三輪for(int j=0;j總結規律:遍歷的次數就是最大值的位數

總的**

public static void radixsort(int arr)

} //得到最大數的位數

int maxlen =(max+"").length();

int bucket = new int [10][arr.length];

int bucketelementcounts =new int[10];

// 使用迴圈將**處理

for (int i = 0,n=1; i < maxlen; i++,n*=10)

// 按照這個桶的順序(一維陣列的下標依次取出資料,放入原來陣列)

int index = 0;

// 遍歷每乙個桶,並將每個桶的資料放入到原陣列

for (int k = 0; k < bucketelementcounts.length; k++)

}// 第i+1輪處理後,需要將每個bucketelementcounts[k]置0

bucketelementcounts[k] = 0;

}// 列印結果

// system.out.println("第"+(i+1)+"輪排序之後,對個位的處理:");

// for (int k = 0; k < arr.length; k++)

// system.out.println();

}

}

4、時間測試

public static void timetest() 

// 寫乙個測試時間

5、基數排序說明

(1)基數排序是對傳統桶排序的擴充套件,速度很快;

(2)基數排序是經典的空間換時間的方式,占用記憶體很大, 當對海量資料排序時,容易造成 outofmemoryerror;

(3)基數排序時穩定的。[注:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序後的序列中,r[i]仍在r[j]之前,則稱這種排序演算法是穩定的;否則稱為不穩定的] ;

(4)有負數的陣列,我們不用基數排序來進行排序, 如果要支援負數,參考:

排序 基數排序

基數排序 radix sort 是屬於 分配式排序 distribution sort 基數排序法又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作用。排序思想 首先按照資料的最低位 個位 將資料分配到0 9...

桶排序 基數排序 計數基數排序 Java

前面已經講述了很多排序演算法,但是他們的排序演算法都是基於兩個值之間的比較,通過決策樹的方法可以證明深度為d的二叉樹則最多有 一些好的排序演算法是可以達到時間複雜度是線性的,桶排序就是其中一種。比如有n個數,但是這些數的最大數不超過m。這個時候就可以定義乙個含有m個元素的陣列 初始值為0 然後遍歷n...

計數排序 基數排序

一.計數排序 counting sort 基本思想 對每乙個輸入元素x,確定出小於x的元素個數。適用範圍 適用於輸入是由小範圍的整數構成的序列。穩定性 演算法是穩定的。具體實現 include using namespace std arr 初始輸入陣列,res 存放排序結果的陣列,hash臨時儲存...