身份证号码都固定住,完全可以采纳基点排序的方式,
归纳下基点排序复杂度,首先O(n+d),它没办法如同其他快排、冒泡等在不开辟额外空间的情况下进行自我排序,但是也没有归并排序等开辟如此大空间度。
适应的应用场景比较具有局限性,恰巧在公司的一组固定长度的排序过程中,有很好的解决方式。
主要用是通过bucket的概念,把数组迁移后,进行重排的过程,我的代码比较不够严谨,主要是能够帮我理清思路,
假设有?"672", "181", "363", "720"?
第一次
bucket[0]:720 bucket[1]:181 bucket[2]:672 bucket[3]:363
?结果:720、181、672、363
第二次
bucket[2]:720 bucket[6]:363 bucket[7]:672 bucket[8]:181
?结果:720、363、672、181
第三次
bucket[1]:181 bucket[3]:363 bucket[6]:672 bucket[7]:720
?最终结果:181、363、672、720
package com.butterfly.nioserver;
/**
*
* @author young
*
*/
public class Sort {
public static void main(String[] args) {
String[] arr = { "672", "181", "363", "720" };
int leng = 3;
int count = 0;
while ((leng - count) > 0) {
String[] buckets = new String[10];
for (int val = 0; val < arr.length; val++) {
// 余数
int remainder = Integer.valueOf(arr[val].substring(leng - count
- 1, leng - count));
buckets[remainder] = arr[val];
}
int j = 0;
for (int b = 0; b < buckets.length; b++) {
if (buckets[b] != null) {
arr[j] = buckets[b];
j++;
}
}
count++;
}
for (String string : arr) {
System.out.println(string);
}
}
}
?
?
?
原文:http://cywhoyi.iteye.com/blog/2220369