Created
August 23, 2012 12:04
-
-
Save sys1yagi/3436034 to your computer and use it in GitHub Desktop.
javaでクイックソート 効率はよくない
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package jp.dip.sys1.yagi.sort; | |
import java.util.ArrayList; | |
import java.util.Arrays; | |
import java.util.Comparator; | |
import java.util.List; | |
import java.util.Random; | |
public class QuickSort { | |
/** | |
* クイックソートやで | |
* @param list ソート対象のリスト | |
* @param comp 比較関数 | |
* @return ソート済みのリスト | |
*/ | |
public static <T> List<T> sort(List<T> list, Comparator<T> comp) { | |
if(list.isEmpty()){ | |
return list; | |
} | |
//ピボットより値の小さいリスト | |
List<T> smaller = new ArrayList<T>(); | |
//ピボットより値の大きいリスト | |
List<T> greater = new ArrayList<T>(); | |
Random p = new Random(System.currentTimeMillis()); | |
//ピボット | |
int index = p.nextInt(list.size()); | |
T pv = list.get(index); | |
//ピボットより小さい値、大きい値で各リストに振り分ける | |
for (int i = 0; i < list.size(); i++) { | |
if (i != index) { | |
T l = list.get(i); | |
if (comp.compare(pv, l) >= 0) { | |
smaller.add(l); | |
} else { | |
greater.add(l); | |
} | |
} | |
} | |
//ピボットより値の小さいリスト、ピボットより値の大きいリストをそれぞれクイックソートにかける | |
//ピボットを真ん中にして連結して返す | |
List<T> result = new ArrayList<T>(); | |
result.addAll(QuickSort.sort(smaller, comp)); | |
result.add(pv); | |
result.addAll(QuickSort.sort(greater, comp)); | |
return result; | |
} | |
//sample | |
public static void main(String[] args) { | |
Integer[] l = new Integer[] { 1, 20, 4205, 539, 5, 2, 104, 100, 6, 1, 7, 239, 2, 55 }; | |
List<Integer> list = Arrays.asList(l); | |
list = QuickSort.sort(list, new Comparator<Integer>() { | |
@Override | |
public int compare(Integer o1, Integer o2) { | |
return o1 - o2; | |
} | |
}); | |
for (Integer r : list) { | |
System.out.println(r); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment