对于这样一个数组,相对它进行快速排序
例如,假设你将3用作基准值,可对得到的子数组进行快速排序。
public static void main(String[] args) {
List list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
list.add(new Random().nextInt(100000));
// list.add(i);
}
StopWatch watch = new StopWatch();
watch.start();
System.out.println("开始执行.....");
// 业务逻辑代码...
System.out.println(quicklySort(list));
watch.stop();
System.out.println("Time Elapsed: " + watch.getTime() + "ms"); // 单位为毫秒
System.out.println(time);
}
private static int time = 0;
private static List quicklySort(List list) {
if (list.size() < 1) {
return list;
}
// 随机选择一个元素作为基准值
int randomInt = new Random().nextInt(list.size());
// int randomInt = list.size() / 2;
// int randomInt = 0;
Integer mid = list.get(randomInt);
List leftElement = new linkedList<>();
List rightElement = new linkedList<>();
for (int i = 0; i < list.size(); i++) {
if (i == randomInt){
continue;
}
time++;
if (list.get(i) < mid) {
leftElement.add(list.get(i));
}else{
rightElement.add(list.get(i));
}
}
List newList = new ArrayList<>(list.size());
newList.addAll(quicklySort(leftElement));
newList.add(mid);
newList.addAll(quicklySort(rightElement));
return newList;
}
对于每次随机取元素作为基准值的时候,对一万个随机元素进行排序,执行14万次循环,通过平均情况可以计算出程序应当是执行10000 * Log2(10000)= 13万次左右,可见随机选择元素是无限接近于平均情况的,相对于每次都取中间的数作为基准值,其实也是接近于13万次,但是综合衡量,其实还是随机选取基准值更稳定,虽然相差不多,但心里还是觉得挺稳定的。


