【发布时间】:2011-01-27 16:43:19
【问题描述】:
我正在尝试在 Java 中实现几种排序算法,以比较性能。根据我的阅读,我期望 quickSort 比 mergeSort 快,但在我的代码中它不是,所以我认为我的 quickSort 算法一定有问题:
public class quickSortExample{
public static void main(String[] args){
Random gen = new Random();
int n = 1000000;
int max = 1500000;
ArrayList<Integer> d = new ArrayList<Integer>();
for(int i = 0; i < n; i++){
d.add(gen.nextInt(max));
}
ArrayList<Integer> r;
long start, end;
start = System.currentTimeMillis();
r = quickSort(d);
end = System.currentTimeMillis();
System.out.println("QuickSort:");
System.out.println("Time: " + (end-start));
//System.out.println(display(d));
//System.out.println(display(r));
}
public static ArrayList<Integer> quickSort(ArrayList<Integer> data){
if(data.size() > 1){
int pivotIndex = getPivotIndex(data);
int pivot = data.get(pivotIndex);
data.remove(pivotIndex);
ArrayList<Integer> smallers = new ArrayList<Integer>();
ArrayList<Integer> largers = new ArrayList<Integer>();
for(int i = 0; i < data.size(); i++){
if(data.get(i) <= pivot){
smallers.add(data.get(i));
}else{
largers.add(data.get(i));
}
}
smallers = quickSort(smallers);
largers = quickSort(largers);
return concat(smallers, pivot, largers);
}else{
return data;
}
}
public static int getPivotIndex(ArrayList<Integer> d){
return (int)Math.floor(d.size()/2.0);
}
public static ArrayList<Integer> concat(ArrayList<Integer> s, int p, ArrayList<Integer> l){
ArrayList<Integer> arr = new ArrayList<Integer>(s);
arr.add(p);
arr.addAll(l);
return arr;
}
public static String display(ArrayList<Integer> data){
String s = "[";
for(int i=0; i < data.size(); i++){
s += data.get(i) + ", ";
}
return (s+"]");
}
}
结果(0 到 1500000 之间的 100 万个整数):
mergeSort(也用 arrayList 实现):1.3sec(平均)(0.7sec 用 int[] 代替)
快速排序:3 秒(平均)
仅仅是我的支点选择不好,还是算法中也存在一些缺陷。
另外,有没有更快的方法用 int[] 而不是 ArrayList() 来编码? (如何声明较大/较小数组的数组大小?)
PS:我现在可以以就地方式实现它,因此它使用更少的内存,但这不是重点。
编辑 1:我通过更改 concat 方法赢得了 1 秒。 谢谢!
【问题讨论】:
-
第一个问题:它们都有效吗?
标签: java performance sorting quicksort mergesort