忽略方法名就是一个简单的快排方法了,想深入研究的同学可以去找找快速排序算法优化方面,我之前做了几个优化,可能是因为随机数取值的原因反而测试速度变慢。所以快排是不稳定的排序算法。
public static List<Integer> kuaisupaixu(List<Integer> integers){
if (integers.size() > 1) {
Integer chose1 = integers.get(0);
Integer chose2 = integers.get(integers.size() -1);
Integer chose3 = integers.get(integers.size()/2);
Integer chose = 0;
chose = quzhongjianzhi(chose1,chose2,chose3);
List<Integer> small = new ArrayList<>();
List<Integer> larger = new ArrayList<>();
List<Integer> same = new ArrayList<>();
for (Integer i : integers) {
if (i < chose) {
small.add(i);
} else if (i > chose) {
larger.add(i);
} else {
same.add(i);
}
}
kuaisupaixu(small);
kuaisupaixu(larger);
integers.clear();
integers.addAll(small);
integers.addAll(same);
integers.addAll(larger);
}
return integers;
}
private static int quzhongjianzhi(int a, int b, int c) {
if ((b - a) * (a - c) >= 0) {
return a;
} else if ((a - b) * (b - c) >= 0) {
return b;
} else {
return c;
}
}
实例
@Test
public void kuaisupaixu(){
//做数
int Length1 = 100000;
List<Integer> integers = new ArrayList<>(Length1);
Random random = new Random(20);
int n = 0;
for (int i = 0; i < Length1; i++) {
n = random.nextInt(Length1);
integers.add(n);
}
System.out.println(integers.toString());
System.out.println(integers.get(integers.size()/2));
long startTime = System.currentTimeMillis();
//排序算法
integers = PaiXuUtil.kuaisupaixu(integers);
long endTime = System.currentTimeMillis();
System.out.println(integers.toString());
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //180ms
}