1 public static void main(String[] args)
2 {
3 Scanner input = new Scanner(System.in);
4 int n = input.nextInt();
5 int[] a = new int[n];
6
7 for(int i = 0; i < a.length; i++)
8 a[i] = (int)(Math.random() * 100);
9
10 System.out.println("Before sort:");
11 //System.out.println(Arrays.toString(a));
12 long start = System.currentTimeMillis();
13 divide(a, 0, a.length - 1);
14 long end = System.currentTimeMillis();
15 //10000000个测试数据用时约为550ms 相对于归并排序有较大提升
16 System.out.println("After sort: ");
17 //System.out.println(Arrays.toString(a));
18 System.out.println(end - start);
19 }
20
21 public static void divide(int[] a, int left, int right)
22 {
23 if(left >= right) //大于号防止数组为空
24 return;
25
26 int value = QuickSort(a, left, right);
27 //先处理右半边
28 divide(a, value + 1, right);
29 //再处理左半边
30 divide(a, left, value - 1); //分割时不能将value作为边界 否则排序数字相同的数组会导致无限递归
31 }
32
33 public static int QuickSort(int[] a, int left, int right)
34 {
35 int i = left, j = right + 1;
36 int key = a[left];
37
38 while(true)
39 {
40 while(a[--j] > key)
41 if(j == left) //该判断其实是冗余的 可以去掉
42 break;
43 while(a[++i] < key)
44 if(i == right)
45 break;
46 if(i >= j) //不判断相等的情况会导致数组下标越界(传入两个相同的元素)
47 break;
48 int temp = a[j];
49 a[j] = a[i];
50 a[i] = temp;
51 }
52
53 int t = a[left];
54 a[left] = a[j];
55 a[j] = t;
56 return j;
57 }