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] + " ");
		}
	}
}

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