/* * Copyright 2015 Evgeny Dolganov (evgenij.dolganov@gmail.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package heap; import static java.lang.System.*; import java.util.ArrayList; import java.util.LinkedList; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import och.util.concurrent.ExecutorsUtil; public class SortTest { public static void main(String[] args) { Random r = new Random(); System.out.println("create data..."); int size = 500_000; //size = 100; int[] data1 = new int[size]; int[] data2 = new int[size]; int[] data3 = new int[size]; for (int i = 0; i < data1.length; i++) { int val = Math.abs(r.nextInt(size+1)); data1[i] = val; data2[i] = val; data3[i] = val; } System.out.println("done"); long start = currentTimeMillis(); sortQuick(data2); System.out.println("quick sort: "+ ((currentTimeMillis()-start)/1000.)); for (int i = 0; i < data2.length-1; i++) { if(data2[i] > data2[i+1]) { System.out.println("! invalid quick sort"); break; } } System.out.println("done"); start = currentTimeMillis(); sortQuickAsync(data3); System.out.println("quick sort async: "+ ((currentTimeMillis()-start)/1000.)); for (int i = 0; i < data3.length-1; i++) { if(data3[i] > data3[i+1]) { System.out.println("! invalid quick sort async"); break; } } System.out.println("done"); if(true){ return; } start = currentTimeMillis(); sortBubble(data1); System.out.println("bubble sort: "+ ((currentTimeMillis()-start)/1000.)); for (int i = 0; i < data1.length-1; i++) { if(data1[i] > data1[i+1]) { System.out.println("! invalid bubble sort"); break; } } System.out.println("done"); } private static void sortBubble(int[] data) { int temp; boolean allDone; for (int i = 0; i < data.length-1; i++) { allDone = true; for (int j = 0; j < data.length-1; j++) { if(data[j] > data[j+1]){ temp = data[j+1]; data[j+1] = data[j]; data[j] = temp; allDone = false; } } if(allDone) break; } } static class QuickData { int from; int last; public QuickData(int from, int last) { this.from = from; this.last = last; } } private static void sortQuick(int[] data) { LinkedList<QuickData> queue = new LinkedList<>(); queue.addLast(new QuickData(0, data.length-1)); int curSize; int sepIndex; int sepData; LinkedList<Integer> toR = new LinkedList<>(); LinkedList<Integer> toL = new LinkedList<>(); while( ! queue.isEmpty()){ QuickData cur = queue.removeFirst(); curSize = cur.last + 1 - cur.from; sepIndex = cur.from + curSize / 2; sepData = data[sepIndex]; toR.clear(); toL.clear(); for (int i = 0+cur.from; i < sepIndex; i++) { if(data[i] > sepData){ toR.add(i); } else { toL.add(i); } } for(int i = sepIndex+1; i < cur.last+1; i++){ if(data[i] < sepData){ toL.add(i); } else { toR.add(i); } } boolean sepDone = false; for(int i = cur.from; i < cur.last+1; i++){ if(toL.size() > 0) data[i] = toL.removeFirst(); else if( ! sepDone) { data[i] = sepData; sepDone = true; } else data[i] = toR.removeFirst(); } if(curSize > 2){ queue.addLast(new QuickData(cur.from, sepIndex)); queue.addLast(new QuickData(sepIndex+1, cur.last)); } } } private static void sortQuickAsync(int[] data) { ExecutorService executor = ExecutorsUtil.newFixedThreadPool("sortTest", Runtime.getRuntime().availableProcessors()); ArrayList<Future<?>> futures = new ArrayList<>(); } }