对于这样一个数组,相对它进行快速排序
例如,假设你将3用作基准值,可对得到的子数组进行快速排序。
public static void main(String[] args) { List对于每次随机取元素作为基准值的时候,对一万个随机元素进行排序,执行14万次循环,通过平均情况可以计算出程序应当是执行10000 * Log2(10000)= 13万次左右,可见随机选择元素是无限接近于平均情况的,相对于每次都取中间的数作为基准值,其实也是接近于13万次,但是综合衡量,其实还是随机选取基准值更稳定,虽然相差不多,但心里还是觉得挺稳定的。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; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)