快速排序我的理解是对冒泡排序的改进,核心是基于二分的思想,而且每次都选取固定基数进行跳跃式的比较。实现代码如下:
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。而现在的结果明显是错误的,所以必须按照选取左边为基准数必须从右边开始比较,以免出现例子中的问题。