原理
分治算法,每次确定一个值的位置,即将一个值在数组中排好顺序,并且分成左右两部分,左边的值都比该值小,右边的值都比该值大
思路
-
我们默认每次的基准数(即要排序的数)都为数组中的第一个数
-
先从数组的最右边开始,向左循环找到比基准数小的数
-
在从数组的左边开始,向右循环找到比基准数大的数
-
将两数交换位置
-
重复234步骤直到左右下标相遇
-
将数组分为左右两部分进行递归
代码
public class QuickSort {
/**
* 快速排序: 原理是首先确定一个基准数(本程序采用left为基准数),将数组分为基准数左右两部分,左边比基准数小,右边比基准数大,之后将基准数放到相应的位置,
* 即每次都确定一个数的位置
* 再以基准数左右两边作为两个数组进行上述操作(递归),直到right<left为止
* @param arr
* @param left 左起始
* @param right 右起始
* @return
*/
public int[] quickSort(int arr[] , int left , int right){
if (right < left) {
return arr;
}
int index = arr[left];// 基准数
int temp = 0;
int q = left ;
int p = right ;
while (p != q) {
// 先进行右边的移动的原因是,最后基准数的位置要比p小,比q大
while (p > q && arr[p] >= index) {// 从最右边找到比基准数小的数准备交换
p--;
}
while (p > q && arr[q] <= index) {// 从最左边找到比基准数大的数准备交换
q++;
}
// 交换两个数,保证右边的数都比基准数大,左边的都比基准数小
temp = arr[p];
arr[p] = arr[q];
arr[q] = temp;
}
// 基准数定位,注意这里因为是现移动的右边,所以在q==p的时候,是停在较小的数上的
// 即left~q的数都比index小,q+1~right的数都比index大
arr[left] = arr[p];
arr[p] = index;
// 进入遍历
quickSort(arr,p+1,right);
quickSort(arr,left,p-1);
return arr;
}