前些天用java做了一个数组乱序,首先建立快速排序算法,排序的依据是根据序列中随机产生的序列号,序列号利用map保证在每次排序过程中只产生一次:
有没有更好的实现呢,查阅Java API, 才发现:
API实现是向后遍历列表,从最后一个元素一直到第二个元素,将随机选择的元素重复交换到“当前位置”。元素是从列表中随机选择的,从第一个元素运行到当前位置(包括)。
此方法以线性时间运行。而我上面提出的方法将是n*logn
java的Collections中的工具方法shuffle就是这样实现的。
java 代码
- public static void randomList(List list) {
- Collections.sort(list, new Comparator(){
- HashMap map = new HashMap();
- public int compare(Object v1, Object v2) {
- init(v1);
- init(v2);
- double n1 = ((Double)map.get(v1)).doubleValue();
- double n2 = ((Double)map.get(v2)).doubleValue();
- if(n1 > n2)
- return 1;
- else if(n1 < n2)
- return -1;
- return 0;
- }
- private void init(Object v){
- if(map.get(v) == null){
- map.put(v, new Double(Math.random()));
- }
- }
- protected void finalize() throws Throwable {
- map = null;
- }
- });
- }
API实现是向后遍历列表,从最后一个元素一直到第二个元素,将随机选择的元素重复交换到“当前位置”。元素是从列表中随机选择的,从第一个元素运行到当前位置(包括)。
此方法以线性时间运行。而我上面提出的方法将是n*logn
java的Collections中的工具方法shuffle就是这样实现的。