Quick Sort(Java)

 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     }

 

posted @ 2019-03-15 22:25  Huayra  阅读(174)  评论(0编辑  收藏  举报