排序-基数排序

[b]基数排序[/b]:是针对特定规则的数据进行优化的一种排序算法,效率应该是所有算法中最高的排序算法,[b]它不再考虑数据整体的大小,而是考虑整体的分解后的部分大小和整体大小之间的关系而形成的一种算法[/b],分解后的部分为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));

}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值