快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
/*
* 快速排序就是先选定一个基准值(参考值,你随便叫)
* 然后通过从两头遍历发现符合条件的就赋值交换,直到该基准值的两边
* 一边的元素都大于基准值,一边的元素都小于基准值
* 这样通过多次递归,就可以实现排序功能
*/
public class Q {
static void fun(int []a,int low , int high){
// 左边的下标不能大于等于右边的下标,(跑过了)
if(low>=high){
return;
}
int i=low; //左边开始
int j=high; // 右边开始
int key = a[low]; //选的基准值,你随便选,一般都是左边,中间和右边
//while循环在不停的进行以key为分割线的分割操作
while( i<j ){
while(i<j && key <= a[j]){
j--;
}
a[i] = a[j];
while(i<j && key >=a[i]){
i++;
}
a[j] = a[i];
}
a[i] = key; //最后确定基准值的位置
fun(a,low,i-1); //基准值的左边递归
fun(a,i+1,high); //基准值右边递归
}
public static void main(String[] args) {
int arr[] = {6,3,2,1,5,4,9,7,10,8};
fun(arr,0,arr.length-1);
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]+" ");
}
}
}
快速排序平均时间复杂度是O(N*logN)。最好也是O(N*logN),但最环情况是O(N^2)。
最坏情况为每次都把数据分成N-1个数和1个数,每一次循环完了都是1,,,,,;1,2,,,,,;1,2,3,,,,,这样就和插入、选择时间复杂度一样了。所以我们在选取基准值的时候,还是要尽量选取大小位于中间的值,这样速度最快。