身份证号码都固定住,完全可以采纳基点排序的方式,
归纳下基点排序复杂度,首先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