排序算法大全之基数排序

排序算法大全之——基数排序

基数排序是一种分配式排序,又成为桶子法排序

LSD(我们以最低位优先)

第一步:假设原有一串数字如下:

   23,45,12,32,43

   遍历这些数的个位数字,将他们分别装进编号为0到9的桶中

   桶  0:为空,因为这些数中没有个位数为0的

   桶  1:空

   桶  2:12,32

   桶  3:23,43

   桶  4:空

   桶  5:45

   桶  6:空

   桶  7:空

   桶  8:空

   桶  9:空

第二步

   接下来将这些桶中的数据依次串起来,排成一排:

   12,32,23,43,45

   接下来,再进行一次分配,这次以十位数字来分

   

   桶  0:空

   桶  1:12

   桶  2:23

   桶  3:32

   桶  4:43,45

   桶  5:空

   桶  6:空

   桶  7:空

   桶  8:空

   桶  9:空

第三步:桶中的数据在依次按照0到9桶的顺序串起来

得到:12,23,32,43,45

LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好。MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个“桶子”中建立“子桶”,将每个桶子中的数值按照下一数位的值分配到“子桶”中。在进行完最低位数的分配后再合并回单一的数组中。

package com.wukung.blog;

/**
 * @author WuKung
 * @csdnURL http://blog.csdn.net/wu_kung/
 * @createdDate 2014-5-3 下午11:15:40
 */
public class LSDTest {

	/**
	 * 对一群两位数进行基数排序
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a = {23,45,12,32};
		LSD(a,2);
		for(int i=0;i<a.length;i++){
			System.out.print(" "+a[i]);
		}
	}

	public static void LSD(int[] data,int d){
		int k=0;
		int n=1;
		int m=1;

		int[][] temp = new int[10][data.length];
		int[] order = new int[10];

		while(m<=d){
			for(int i=0;i<data.length;i++){

				int lsd = (data[i]/n)%10;
				temp[lsd][order[lsd]] = data[i];
				order[lsd]++;
			}

			for(int i=0;i<10;i++){

				if(order[i]!=0){
					for(int j=0;j<order[i];j++){
						data[k]=temp[i][j];
						k++;
					}
					//这一步骤容易遗忘,记得请0,为外层循环的下一步做准备
					order[i]=0;
				}

			}
			k=0;
			n=n*10;
			m++;
		}

	}

}

排序算法大全之基数排序

时间: 2024-10-05 04:01:34

排序算法大全之基数排序的相关文章

排序算法七:基数排序(Radix sort)

上一篇提到了计数排序,它在输入序列元素的取值范围较小时,表现不俗.但是,现实生活中不总是满足这个条件,比如最大整形数据可以达到231-1,这样就存在2个问题: 1)因为m的值很大,不再满足m=O(n),计数排序的时间复杂也就不再是线性的: 2)当m很大时,为计数数组申请的内存空间会很大: 为解决这两个问题,本篇讨论基数排序(Radix sort),基数排列的思想是: 1)将先按照某个基数将输入序列的每个元素划分成若干部分,每个部分对排序结果的影响是有优先级的: 2)先按低优先级排序,再按高优先级

常见排序算法导读(10)[基数排序]

与前面介绍的7种排序算法不同,基数排序(Radix Sort)是基于多关键字排序的一种排序算法.也就是说,前面介绍的7种排序算法是建立在对单个元素关键字比较的基础之上,而基数排序则是采用"分配"与"收集"的办法,用对多关键字进行排序的思想实现对单个关键字的排序. 基数排序的典型例子当然就是扑克牌排序啦,几乎所有的数据结构教科书都会讲到,原因是形象易懂.每张扑克牌都有两个关键字:花色和面值.假定有序关系为: 花色: 黑桃 < 红桃 < 梅花 < 方块

C# 经典排序算法大全

C# 经典排序算法大全 选择排序 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace sorter { public class SelectionSorter { private int min; public void Sort(int[] arr) { for (int i = 0; i < arr.Length - 1; ++i) { min = i

c排序算法大全

排序算法是一种基本并且常用的算法.由于实际工作中处理的数量巨大,所以排序算法 对算法本身的速度要求很高. 而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示.在后面将给出详细的说明.<计算机程序设计技巧>(第三卷,排序和查找)     对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲. 我将按照算法的复杂度,从简单到难来分析算法.第一部分是简单排序算法,后面你将看到他们的共同点是算法复杂度为O(N*N)(因为没有使用word,所以无法打出上标和下标).第二部分是高

排序算法六(基数排序)

一.原理介绍 所谓的基数排序算法,即使对于待排序数据,将其看做数据数位相同的数据. 随后一次依据每个数字个位大小排序,重新排序之后,再根据每一个数字的十位大小排序,依次进行,最后数据就可以达到一个整体有序的状态. 二.实例 对于这样的一系列数据: int arr[15] = { 123, 234, 543, 324, 568, 975, 547, 672, 783, 239,124,567,865,579,532 }; 我们依次检索个位,统计每一个数据的个位数,依次放置在 0-9 九个格子里,代

排序算法之JAVA基数排序算法

package net.qh.test.sort; import java.util.ArrayList; import java.util.List; /** * Created by Administrator on 2016/03/07. */ public class Radix { public static int[] asc( int[] array ){ int index = 1; /** 最大数字位数(如100为3位数字,2000为4位数字) */ /** 取得最大数字位数

【数据结构】非比较排序算法(实现计数排序和基数排序)

● 计数排序 1.算法思想: 计数排序是直接定址法的变形.通过开辟一定大小的空间,统计相同数据出现的次数,然后回写到原序列中. 2.步骤: 1)找到序列中的最大和最小数据,确定开辟的空间大小. 2)开辟空间,利用开辟的空间存放各数据的个数. 3)将排好序的序列回写到原序列中. 具体实现如下: void CountSort(int *arr, int size) {  assert(arr);  int min = arr[0];  int max = arr[0];  int num = 0;

常见的排序算法

描述: 排序算法可谓数据结构模块中的重中之重,常见的哈希表,二叉树,搜索树/平衡树,位图等数据结构只是处理实际问题的抽象方法,实际在处理接受或生成的数据集时,排序算法显得尤其重要,排序算法家族很庞大,其中包括了冒泡排序,选择排序,插入排序,堆排序,快速排序,归并排序,基数排序,计数排序,希尔排序,箱排序,树型排序等众多算法,每种排序都有各自的特性,没有好坏之分,只有在特定的场景使用合适的排序算法才是上策,单纯的来比显得太过绝对,没有可比性.因为实际需求及各方面条件的限制使得排序算法的可选范围往往

排序算法汇总(C/C++实现)

前言:     本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的校级赛.区域赛.没什么惊天动地的奖项,最好的名次也就省三等奖.现在作为第一篇算法总结就拿常见的排序算法以我个人的理解,以及代码实现跟大家简单分享一下(排序算法如果一一罗列的话,不下十种.曾在图书馆的旧书架上看过一本近900页的书,内容就是专门介绍排序算法). 选择排序(select) 选择排序比较容