最近做题,发现冒泡和选择排序的复杂度太大了,容易超时,于是就学习了快排****
快排:简单地说就是找到一个基准数字m,数组中比m大的放在右边,比m小的放在左边,这样m的位置是正确的的。然后利用递归再分别对两边进行快排
下面我逐步讲解一下快排的思路:
1.假定对数组{6,1,7,5,3,11}进行快排
2.首先在这个序列中找一个数作为基准数,为了方便可以取第一个数6
3.进行初步快排之后,变成{5,1,3,6,7,11}
4.这是如何做到的呢,取6为基准
5.从数组最右向左边遍历找到一个比6小的数字,记为j
6.同理:遍历数组左边,找到比6大的数字,记为i
7.然后交换i和j所在位置的数字,然后继续检索
8.直到i= =j,表示本次检索已经结束,讲i与基准数字换位。此时基准数字已经找到自己的位置了
9.然后把数组根据基准数=左右分成两部分,利用递归再进行排序
就像:
原数组 :6,1,7,5,3,11---------key:6
第一次交换:6,1,3,5,7,11------3和7进行交换
第二次交换:5,1,3,6,7,11-------此时i==j
那么如果第四个数字5换成8会怎么样?当初我就感觉如果这样还要再加一个判断,思考一下,问题会在最后揭晓
接下来先上代码:`
import java.sql.Array;
import java.util.Arrays;
public class test1 {
public static void main(String[] args) {
int [] arr= {6,1,8,7,5,2,3,11};
System.out.println(Arrays.toString(arr));
quickSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
private static void quickSort(int[] arr, int left, int right) {
if(left>=right) return;//如果边界相等,就直接结束循环了
int key=arr[left];
int i=left;
int j=right;
while(i<j) {
while(i<j&&arr[j]>=key) {//遇到比key大的数字,向左检索
j--;
}
while(i<j&&arr[i]<=key) {//从左开始,遇到比key小的数字,向右检索
i++;
}
if(i<j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
//此时i==j
arr[left]=arr[i];
arr[i]=key;
quickSort(arr, left, i-1);
quickSort(arr, i+1, right);
}
}
如果把5换成8,那么程序在执行下面这个语句是while(i<j&&arr[j]<key) {//遇到比key大的数字,向左检索 j--; }
因为满足条件,会自动向左在移动一位。我当时查资料的时候就一直迷在这里,以为还要再加一个判断