插入排序可以升级为希尔排序,那冒泡排序可不可以升级一下?当然可以,那就是快速排序。

基本思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
image.png

实现思路

根据基准值所在位置不同,快排可分为三种实现方式,这里采用最为巧妙的方式——中间基准——来实现
`//快速排序,参数里要包含左指针和右指针
public static void quickSort(int[] arr,int left,int right){
int l = left;//左索引
int r = right;//右索引
//前面两步可以保留left和right变量到递归的时候用
int temp = 0;
int pivot = arr[(l+r)/2];_//中轴值

  1. //while循环的目的是让比pivot小的数放到左边,大的放到右边<br /> _**while **(l<r){<br /> _//在pivot左边一直找,找到>=pivot的值才退出,左指针<br /> _**while **(arr[l] < pivot){<br /> l+=1;<br /> }<br /> _//在pivot右边一直找,找到<=pivot的值才退出,右指针<br /> _**while **(arr[r] > pivot){<br /> r -= 1;<br /> }
  2. **if **(l>=r){<br /> **break**;<br /> }
  3. _//交换<br /> _temp = arr[l];<br /> arr[l] = arr[r];<br /> arr[r] = temp;
  4. _//如果交换完后,发现这个arr[l] == pivot,r--,前移<br /> _**if **(arr[l] == pivot){<br /> r -= 1;<br /> }<br /> _//如果交换完后,发现这个arr[r] == pivot,l++,后移<br /> _**if **(arr[r] == pivot){<br /> l += 1;<br /> }<br /> _//这两个if循环很巧妙的避免了有数和pivot相等陷入死循环,如7,21,7 当指针运行到两个数字7上面时,<br /> //如果没有if,则会导致7和7不停地替换,永远跳不出循环
  5. _}<br /> _//如果l == r,必须l++,r--,否则会出现栈溢出<br /> _**if **(l == r){<br /> l += 1;<br /> r -= 1;<br /> }<br /> _//向左递归<br /> _**if **(left < r){<br /> _quickSort_(arr, left, r);<br /> }<br /> _//向右递归<br /> _**if **(right > l){<br /> _quickSort_(arr,l, right);<br /> }
  6. }`