20191015:基數排序法

描述

基數排序法則是屬於分配式排序, 基數排序法又稱桶排序法顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度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] + " ");
		}
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章