目录
思想
快速排序是基于二分的思想,对冒泡排序的一种改进,主要思想是确立一个基数,将小于基数的数放到基数左边,大于基数的数字放到基数右边,然后再对这两部分进一步排序,从而实现对数组的排序,最后再使用递归。
过程图解
首先有一个无序的数组,那么我们需要这么几个参数:left、right、key
left,right两个指针,一个指向数组最左边,一个指向数组最右边
还需要有一个关键点,key,一开始我们认为key就在数组最左边那个数字
那么我们第一回合要做的事情,就是将比key大的数,全部放到key的右边;比key小的数,全部放在key的左边。
①我们从右边的指针开始移动,1比3小,那么右边的指针就停在了1的位置,我们移动left指针,找比3大的数,那么left指针就停留在5的位置
并且left指针所指向的元素的下标不等于,右指针所指向的元素的下标位置,所以将两个指针所指向的元素交换位置。
②那么我们继续先移动右指针,找比3小的数字,所以右指针停留在了2的位置,同理,左指针停留在了9的位置。
再将它们的值交换
③继续先移动右边的指针,寻找比3小的数字,但是会发现和左指针重合
当两个指针重合的时候,我们需要将key元素和两个指针同时指向的元素进行交换。
那么可以看到,比key小的数字都在左边,而比key大的数字都在右边。
④但是会发现,我们的整体排序并没有结束,只是完成了一轮排序,那么我们看
左边的数组,和右边的数组继续使用这个方法,就可以完成排序,那么我们将使用递归的方法来完成。
Java代码实现
public class QuickSort {
static int[] arr = new int[]{1,3,4,2,8,6,9};
public static void main(String[] args) {
quick(arr,0,arr.length-1);
for(int i:arr){
System.out.println(i);
}
}
public static void quick(int[] arr,int left,int right){
//如果数组为空或者长度为0,那么返回
if(arr==null||arr.length == 0){
return;
}
//如果左边的值大于右边,也返回
if(left>right){
return;
}
int key = arr[left];
//这个地方就将left的值赋给l,这样的话就能保存住left的值
int l=left;
int r= right;
//当l和r没有重合的时候
while (l!=r){
//右指针寻找小于key的值,注意判断l<r
while (arr[r]>=key&&l<r){
r--;
}
//左指针寻找大于key的值,注意判断l<r
while (arr[l]<=key&&l<r){
l++;
}
if(l<r){
//交换两个指针对应元素的值
int temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
}
}
//交换key和两个指针重合时候的元素
arr[left] = arr[r];
arr[r] =key;
quick(arr,left,l-1);
quick(arr,l+1,right);
}
quick(arr,left,l-1)的话,就是
左边这个数组,最左边还是left,右边就是l-1
quick(arr,l+1,right)
右边这个数组,最左边是l+1,最右边还是right
对结果进行测试,发现已经排好序了~~~