1、图解,快速排序是最好的内部排序,一定要掌握。把图理解到位,下图是一趟的扫描结果,分出来的也是这样的思想去解决。快速排序采用的是分治法的思想,同样归并排序(合并排序)也是采用的是同样的思想。
2、快速排序采用的分治算法的思想,将大问题分解为独立且处理方式的小问题呢,最后将处理结果合并
代码如下:
package com.paixuTest;
import org.xml.sax.helpers.ParserAdapter;
import java.util.Arrays;
/**
* 基准元素,左指针,右指针
* 快速排序采用的思想其实是分治法,将大问题分解为独立的小问题,且每一个小问题的解决方式是一样的
*/
public class kuaiSuPaiSu {
public static void main(String[] args) {
int[] arr = new int[]{5,4,3,2,1};
int _left = 0;
int _right = arr.length-1;
fun(arr,_left,_right);
System.out.println(Arrays.toString(arr));
}
private static void fun(int[] arr, int _left, int _right) {
int left = _left;
int right = _right;
int pro = 0;
if (_left<=_right){
pro = arr[left];
while (left!=right){
// 从右往左扫描 找小的
while (right>left && arr[right]>=pro)
right--;
arr[left] = arr[right];
// 从左往右扫描 找大的
while (left<right && arr[left]<=pro)
left++;
arr[right] = arr[left];
}
// 将基准元素放在合适的位置
arr[left] = pro;
// 对两边的元素分别执行这个方法,得抛开已经确认了的基准元素位置
fun(arr,_left,left-1); // 注意
fun(arr,right+1,_right); // 注意
}
}
}
注意:基准元素,从右往左扫描,从左往右扫描。最后确定基准元素的位置。没扫描完一趟就最终确认基准元素的位置,且每次基准元素的选取均为最左边的第一个元素。
3、时间复杂度:
最好:nlog2n
平均:nlog2n
最坏 nn
稳定:不稳定