快速排序我的理解是对冒泡排序的改进,核心是基于二分的思想,而且每次都选取固定基数进行跳跃式的比较。实现代码如下:

 1 package test.com;
 2 
 3 import java.util.Arrays;
 4 import java.util.Random;
 5 
 6 public class Quicksort {
 7     
 8     public static void main(String[] args) {
 9         
10         int len = 10;
11         int[] score = getIntArrays(len);
12 //        int[] score = new int[]{53, 57, 17, 12, 79, 88, 94, 31, 48, 44};
13         System.out.println(Arrays.toString(score));
14         quicksort(score,0,len-1);
15         System.out.println(Arrays.toString(score));
16 
17     }
18     
19     /**
20      * 快速排序算法实现
21      * @param arrays 需要排序的数组
22      * @param left   需要排序的起始位置
23      * @param right  需要排序的结束位置
24      */
25     private static void quicksort(int[] arrays,int left,int right){
26         
27         //起始位置必须小于结束位置
28         if(left >= right){
29             return;
30         }
31         //快速排序实现的思想为二分原理,下面递归调用需要用到原始起始和结束位置,所以重新赋值变量负责比较大小调换顺序
32         int left_i = left;
33         int right_j = right;
34         
35         //起始位置必须小于结束位置
36         while(left_i < right_j){
37             
38             //以左边起始位置为比较基数,必须从结束位置开始比较
39             //从大到小排序查询大于基数的位置
40             while(arrays[right_j] <= arrays[left] &&  left_i < right_j){
41                 right_j--;
42             }
43             //从大到小排序查询小于基数的位置
44             while(arrays[left_i] >= arrays[left] &&  left_i < right_j){
45                 left_i++;
46             }
47             //两边数字交换位置
48             if(left_i < right_j && arrays[left_i]!=arrays[right_j]){
49                 
50                 arrays[left_i] = arrays[left_i] ^ arrays[right_j];
51                 arrays[right_j] = arrays[left_i] ^ arrays[right_j];
52                 arrays[left_i] = arrays[left_i] ^ arrays[right_j];
53             }
54             
55         }
56         //当left_i==right_j时说明比较已经进行了一轮,比较停留的位置和基数位置的数字交换位置
57         if(arrays[left] != arrays[left_i]){
58             arrays[left] = arrays[left] ^ arrays[left_i];
59             arrays[left_i] = arrays[left] ^ arrays[left_i];
60             arrays[left] = arrays[left] ^ arrays[left_i];
61         }
62         //递归进行下一轮排序直到全部数字比较完成
63         quicksort(arrays, left, left_i-1);
64         quicksort(arrays, left_i+1, right);
65     }
66     
67 
68     /**
69      * 产生length位随机数数组
70      * @param length
71      * @return
72      */
73     private static int[] getIntArrays(int length){
74         int[] intArrays = new int[length];
75         Random random = new Random();
76         for(int i=0;i<length;i++){
77             intArrays[i] = (int) (100 * random.nextFloat());
78         }
79         return intArrays;
80         
81     }
82 }

其中选取左边为基准数必须从右边开始比较,分析原因如下:

待排序数组[6,1,8],    从大到小开始排序如果从左边先开始比较,6为基准数第一次对比后的结果为[8,1,6],正常结果应该6左边的数大于等于6,6右边的数小于等于6。而现在的结果明显是错误的,所以必须按照选取左边为基准数必须从右边开始比较,以免出现例子中的问题。