一、快速排序法介绍
快速排序(Quicksort)是对冒泡排序的一种改进。
基本思想是:通过一趟排序将要排序的数据分割成独立的两 部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排 序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
二、快速排序法示意图
三、快速排序法应用实例
需求:
对 [-9,78,0,23,-567,70] 进行从小到大的排序,要求使用快速排序法。
1.使用快速排序以中间值为基准值,代码实现
public class QuickSort {public static void main(String[] args) {int[] arr = {-9,78,0,23,-567,70, -1,900, 4561};quickSort(arr, 0, arr.length-1);}public static void quickSort(int[] arr,int left, int right) {int l = left; //左下标int r = right; //右下标//pivot 中轴值int pivot = arr[(left + right) / 2];int temp = 0; //临时变量,作为交换时使用//while 循环的目的是让比 pivot 值小放到左边//比 pivot 值大放到右边while( l < r) {//在 pivot 的左边一直找,找到大于等于 pivot 值,才退出while( arr[l] < pivot) {l += 1;}//在 pivot 的右边一直找,找到小于等于 pivot 值,才退出while(arr[r] > pivot) {r -= 1;}//如果 l >= r 说明 pivot 的左右两的值,已经按照左边全部是//小于等于 pivot 值,右边全部是大于等于 pivot 值if( l >= r) {break;}//交换temp = arr[l];arr[l] = arr[r];arr[r] = temp;//如果交换完后,发现这个 arr[l] == pivot 值 相等 r--, 前移if(arr[l] == pivot) {r -= 1;}//如果交换完后,发现这个 arr[r] == pivot 值 相等 l++, 后移if(arr[r] == pivot) {l += 1;}}// 如果 l == r, 必须 l++, r--, 否则为出现栈溢出if (l == r) {l += 1;r -= 1;}//向左递归if(left < r) {quickSort(arr, left, r);}//向右递归if(right > l) {quickSort(arr, l, right);}}}
2.使用快速排序以第一个数为基准值,代码实现
public class QuickSort {public static void main(String[] args) {int[] arr = {-9,78,0,23,-567,70, -1,900, 4561};quickSort(arr, 0, arr.length-1);}//快速排序算法(从小到大)//arr:需要排序的数组,left:需要排序的区间左边界,right:需要排序的区间的右边界public static void quickSort(int[] arr,int left, int right) {int temp = arr[left]; //将区间的第一个数作为基准数int l = left; //从左到右进行查找时的“指针”,指示当前左位置int r = right;//从右到左进行查找时的“指针”,指示当前右位置//不重复遍历while (l < r) {//当右边的数大于基准数时,略过,继续向左查找//不满足条件时跳出循环,此时的j对应的元素是小于基准元素的while (l < r && arr[r] > temp) { //(重复的基准元素集合到左区间)r--;}arr[l] = arr[r]; //将右边小于等于基准元素的数填入左边相应位置//当左边的数小于等于基准数时,略过,继续向右查找//不满足条件时跳出循环,此时的i对应的元素是大于等于基准元素的while (l < r && arr[l] <= temp) {l++;}arr[r] = arr[l];//将左边大于基准元素的数填入左边相应位置}// 将基准值填入// 因为基准值是从左边的第一个位置获取的,所以也是最后赋值到左边arr[l] = temp;//此时的i即为基准元素的位置//对基准元素的左边子区间进行相似的快速排序if (left < l - 1) { // 如果 left < l- 1 说明左边还没有遍历完quickSort2(arr, left, l - 1);}if (l + 1 < right) { // 如果 right > l + 1 说明右边还没有遍历完quickSort2(arr, l + 1, right);}}}

