描述
基數排序法則是屬於分配式排序, 基數排序法又稱桶排序法顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度O(nlog®m),其中r爲所採取的基數,而m爲堆數,在某些時候,基數排序法的效率高於其它的比較性排序法。
示例
/*
73, 22, 93, 43, 55, 14, 28, 65, 39, 81
1 2 3 4 5 6 7 8 9 10
temp 1 73
2 22
3 93
4 43
5 55
6 14
7 28
8 65
9 39
10 81
按照順序重新排列:
81 22 73 93 43 14 55 65 28 39
再按照十位數排列:
1 2 3 4 5 6 7 8 9 10
temp 1 81
2 22
3 73
4 93
5 43
6 14
7 55
8 65
9 28
10 39
再次重排得到正確的順序:
14 22 28 39 43 55 65 73 81 93
*/
代碼實現
C++實現:
// CardinalSort.cpp : 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
/*
73, 22, 93, 43, 55, 14, 28, 65, 39, 81
1 2 3 4 5 6 7 8 9 10
temp 1 73
2 22
3 93
4 43
5 55
6 14
7 28
8 65
9 39
10 81
按照順序重新排列:
81 22 73 93 43 14 55 65 28 39
再按照十位數排列:
1 2 3 4 5 6 7 8 9 10
temp 1 81
2 22
3 73
4 93
5 43
6 14
7 55
8 65
9 28
10 39
再次重排得到正確的順序:
14 22 28 39 43 55 65 73 81 93
*/
int main(void) {
int data[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81};
int temp[10][10] = {0};
int order[10] = {0};
int i, j, k, n, lsd;
k = 0;
n = 1;
printf("\n排序前: ");
for(i = 0; i < 10; i++)
printf("%d ", data[i]);
putchar('\n');
while(n <= 10) {
for(i = 0; i < 10; i++) {
//拿到個位數數字
lsd = ((data[i] / n) % 10);
//將該數據存放在對應的列上,21就放在第一列,89就放在第9列
temp[lsd][order[lsd]] = data[i];
//order[lsd]表示行數,行數遞增
order[lsd]++;
}
printf("\n重新排列: ");
for(i = 0; i < 10; i++) {
//重新排列,先列後行
if(order[i] != 0){
//先列再行,每一行只有一個數據,每一列的數據按照行序排列
for(j = 0; j < order[i]; j++) {
data[k] = temp[i][j];
printf("%d ", data[k]);
k++;
}
}
order[i] = 0;
}
//n變爲10控制轉換爲取十位數
n *= 10;
k = 0;
}
putchar('\n');
printf("\n排序後: ");
for(i = 0; i < 10; i++)
printf("%d ", data[i]);
return 0;
}
Java實現:
package com.immunize.Arithmetic;
/**
* 基數排序法
*
* @author Mr IMMUNIZE
*
*/
public class RadixSort {
public static void main(String[] args) {
int[] data = { 73, 22, 93, 43, 55, 14, 28, 65, 39, 81 };
int[][] temp = new int[10][10];
int[] order = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int i, j, k, n, lsd;
k = 0;
n = 1;
System.out.println("排序前:");
Print(data);
System.out.println();
while (n <= 10) {
for (i = 0; i < 10; i++) {
// 拿到個位數數字
lsd = ((data[i] / n) % 10);
// 將該數據存放在對應的列上,21就放在第一列,89就放在第9列
temp[lsd][order[lsd]] = data[i];
// order[lsd]表示行數,行數遞增
order[lsd]++;
}
for (i = 0; i < 10; i++) {
// 重新排列,先列後行
if (order[i] != 0) {
// 先列再行,每一行只有一個數據,每一列的數據按照行序排列
for (j = 0; j < order[i]; j++) {
data[k] = temp[i][j];
k++;
}
}
order[i] = 0;
}
n *= 10;
k = 0;
}
System.out.println("排序後:");
Print(data);
}
public static void Print(int[] number) {
for (int i = 0; i < number.length; i++) {
System.out.print(number[i] + " ");
}
}
}