`

排序-基数排序

阅读更多
基数排序:是针对特定规则的数据进行优化的一种排序算法,效率应该是所有算法中最高的排序算法,它不再考虑数据整体的大小,而是考虑整体的分解后的部分大小和整体大小之间的关系而形成的一种算法,分解后的部分为m,那么复杂度为o(m*n),因为m一般很小为常量,所以复杂度近似为o(n)!!!
实现的思想:先排个位,然后排序十为,然后百位,因为位数越高,就越能决定数据的位置!!
下面这个小例子是通过补位的方式实现的一个算法,注意仅仅为了演示这种排序的逻辑,有更稍加改进就会有效率提升!!(改进版很快给出O(∩_∩)O)


package cn.horizon.sort;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Random;
import java.util.TreeMap;

/**
 * 基数排序
 * 
 * @author create by [url=xinchunwang@aliyun.com]新春.王[/url] <br>
 *         date :May 27, 2013 6:34:05 AM
 */
public class RadixSort {
	/**
	 * 初始化数据
	 * 
	 * @return
	 */
	private static Integer[] initUnSortData(int size) {
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < size; i++) {
			list.add(new Random(i).nextInt(i + 1));
		}
		return list.toArray(new Integer[list.size()]);
	}

	/**
	 * 填充数据
	 * 
	 * @param data
	 * @param maxData
	 * @return
	 */
	private static String[] fillData(Integer[] data, int maxData) {
		String[] returnData = new String[data.length];
		int length = new String(maxData + "").length();
		StringBuilder itemBuffer = new StringBuilder();
		for (int i = 0; i < data.length; i++) {
			Integer item = data[i];
			int itemLength = (item.intValue() + "").length();
			int zeroPadding = length - itemLength;
			itemBuffer.append(item);
			for (int j = 0; j < zeroPadding; j++) {
				itemBuffer.insert(0, "0");
			}
			returnData[i] = itemBuffer.toString();
			itemBuffer.setLength(0);
		}
		return returnData;
	}

	/**
	 * 针对data数据,按照data每一项的第index的字符进行排序
	 * @param data
	 * @param index
	 * @return
	 */
	private static String[] sortData(String[] data, int index) {
		TreeMap<String, List<String>> dataMap = new TreeMap<String, List<String>>();
		for (String item : data) {
			char c = item.charAt(index);
			if (dataMap.get(c + "") == null) {
				dataMap.put(c + "", new ArrayList<String>());
			}
			List<String> tempData = dataMap.get(c + "");
			tempData.add(item);
			dataMap.put(c + "", tempData);
		}
		Collection<List<String>> collenctionData = dataMap.values();
		List<String> returnData = new ArrayList<String>();
		for (List<String> item : collenctionData.toArray(new ArrayList[collenctionData.size()])) {
			returnData.addAll(item);
		}
		return returnData.toArray(new String[returnData.size()]);
	}

	public static void main(String[] args) {
		Integer[] initData = initUnSortData(99);
		System.out.println(Arrays.toString(initData));

		String[] filledData = fillData(initData, 99);
		System.out.println(Arrays.toString(filledData));
		//排序个位
		filledData = sortData(filledData, 1);
		System.out.println(Arrays.toString(filledData));
		//排序十位
		filledData = sortData(filledData, 0);
		System.out.println(Arrays.toString(filledData));

	}
}

0
3
分享到:
评论

相关推荐

    数据结构教学课件:第23讲 归并排序-基数排序.pdf

    《数据结构教学课件:第23讲 归并排序-基数排序》 在计算机科学领域,数据结构和算法是核心部分,它们直接影响程序的效率和性能。本讲主要涉及两种重要的排序算法:归并排序和基数排序。这两种排序算法在处理大量...

    算法-理论基础- 排序- 基数排序(包含源程序).rar

    **基数排序**是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这个过程可以类比为人类按身高排队,然后再按照年龄、姓氏等其他特征进行进一步的排序。基数排序在处理...

    C语言版的排序方法---基数排序.docx

    基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。在这个C语言实现的版本中,主要包含两个核心函数:`RadixCountSort` 和 `RadixSort`。 `RadixCountSort` ...

    lemon-guide-基数排序

    JAVADevOps 基数排序 基数排序 基数排序 基数排序 基数排序

    详解Java常用排序算法-基数排序

    Java 基数排序算法详解 基数排序(Radix Sort)是一种非比较排序算法,它的基本思想是将待排序的数组按照位数(个位、十位、百位)进行划分,然后依次对每个位上的数字进行排序,最终得到有序的数组。基数排序的...

    Algorithm-基数排序

    :art: 基数排序 基数排序 基数排序 基数排序 基数排序

    基数排序-radix sort

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种排序方法对于大数据量的处理非常有效,尤其适合于数据范围远大于内存大小的情况。以下是基数排序的详细...

    8.12-8.19-冒泡-选择-插入-希尔-快速-归并-基数-堆排序-排序算法Swift代码及UI演示

    7. 基数排序(Radix Sort):基数排序是一种非比较型排序算法,通过按位数从低到高进行排序,适用于整数排序。它的复杂度可以达到线性O(nk),其中k是数字的最大位数。 8. 堆排序(Heap Sort):堆排序利用了堆这种...

    《数据结构与算法》-李春葆 实验报告-典型排序算法实践-基数排序

    《数据结构与算法》实验报告-典型排序算法实践-基数排序 本实验报告的主要目的是通过基数排序算法的实现来掌握三类内部排序的设计思想、适用范围与算法实现,并深入理解和掌握优化排序算法的设计思想和实现过程。 ...

    基数排序-flash演示

    基数排序-flash演示 可自己输入数据...........

    山东大学-基数排序课程设计

    java版本的基数排序,支持过程演示,支持数据编辑,插入,删除,生成随机数等功能

    基数排序-数据结构

    基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。在这个程序中,基数排序被实现为一个名为`RadixSort`的函数,用于对`SLList`类型的链表进行排序。`SLList`...

    数据结构实验报告--链式基数排序算法.doc

    链式基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。在描述中提到的实验报告中,主要目标是实现一个链式基数排序算法,用于对一组数据进行最低位优先的排序...

    归并排序,基数排序算法比较

    归并排序和基数排序是两种不同的排序算法,它们在实现方式和效率特点上存在显著差异。 **归并排序**是一种基于分治策略的排序算法。它的基本思想是将待排序的序列分成两个长度相等(或近似相等)的部分,分别对这两...

    基数排序、堆排序、希尔排序、直接插入排序

    这里我们将深入探讨四种常见的排序算法:基数排序、堆排序、希尔排序和直接插入排序。 首先,基数排序是一种非比较型整数排序算法,它的基本思想是将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序...

    插入排序冒泡排序堆排序基数排序选择排序快速排序源码

    例如,插入排序和选择排序适合小规模数据,冒泡排序虽然效率较低但实现简单,堆排序和快速排序在处理大规模数据时有较好性能,而基数排序则能处理非负整数排序。在实际开发中,根据具体需求选择合适的排序算法是非常...

    常见算法源代码速查.rar.rar

    - 基数排序 - 桶排序 2. **搜索算法**: - 线性搜索 - 二分搜索 - 哈希搜索 - 深度优先搜索(DFS) - 广度优先搜索(BFS) 3. **图论算法**: - Dijkstra最短路径算法 - Bellman-Ford算法 - Floyd-...

    Java各种排序算法

    - 数据类型:若数据有特定分布(如整数或有序),特定的排序算法可能更具优势,如基数排序对整数排序特别有效。 - 数据已有顺序:如果数据已接近有序,插入排序和冒泡排序在最坏情况下可以达到线性时间复杂度。 - ...

Global site tag (gtag.js) - Google Analytics