定义:快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
思路:
采用递归的方式完成排序,对区间内的数据进行排序,递归内容:
①.选取区间中第一个数作为基准数,取区间第一位为left(此时该位置上保存的是基准数),取区间最后一位为right;
②.从right开始,从右往左查找第一个小于基准数的数,然后left与right位置上的数互换,再left+1;
③.从left开始,从左往右查找第一个大于基准数的数,然后left与right位置上的数互换,再right-1;
④.重复步骤②、③,直至left=right,将基础数保存在这个位置;此时,比基准数大的数在右边,比基准数小的数在左边。
图解:
总结:快速排序是对冒泡排序的一种改进,其之所比较快,是因为较于冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了,因此总的比较和交换次数就少了,速度自然就提高了。
代码实现:
/**
* 快速排序
* @param arr
* @param start
* @param end
*/
public static void quickSort(int[] arr, int start, int end){
// 取区间内的第一个数为基准数
int baseNum = arr[start];
int left = start;
int right = end;
// 如果左右没重合
while (right != left){
// 从right往左寻找比基准数小的数
while (arr[right] >= baseNum && left < right){
right--;
}
if (left < right) {
arr[left] = arr[right];
left++;
}
// 从left往右寻找比基准数大的数
while (arr[left] <= baseNum && left <right){
left++;
}
// 交换俩数位置
if (left < right){
arr[right]=arr[left];
right--;
}
}
// 此时right=left,将基准数与该数交换位置
arr[left] = baseNum;
// 将区间分为俩段,start到left-1,left+1到end
if (start < left){
quickSort(arr, start, left-1);
}
if (end > left){
quickSort(arr, left+1, end);
}
}