5.快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两
部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排
序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。`
重点:
(1)在于需要选一个中轴值pivot,将数组分成左右两组,在分组的过程中,使用双指针分别从头和尾向中轴值pivot遍历,找到位置再一起交换,直到两个指针错位,结束遍历,完成分组。
(2)arr[l] == pivot 和 arr[r] == pivot时将左指针后移,右指针迁移,直到左右指针错位退出循环,防止一直原值交换死循环
(3)l=r,两个指针同时指向同一个数,也会原值交换,死循环,需要r–, l++,错开
public static void quickSort (int[]arr,int left,int right) {
int l = left;//左下标,一般传入0,
int r = right;//右下标,一般传入arr.length-1
//pivot中轴值
int pivot = arr[(left + right) / 2];
int temp = 0;//临时变量,作为交换时用
//while循环的目的是让比pivot值小的放到左边
//让比pivot大的值放到右边
while (l < r) {
//第一步:双指针先定位,定好需要交换的位置
//在pivot的左边一直找,找到大于等于pivot值时才退出
while (arr[l] < pivot) {
l += 1;
}
//在pivot的右边一直找,找到小于等于pivot值时才退出
while (arr[r] > pivot) {
r -= 1;
}
//如果l >= r说明pivot的左右两边的值,已经按照左边全小于等于pivot,右边全大于等于pivot排好了
if (l >= r) {
break;
}
//第二步:交换
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
//交换完后判断,若arr[l] == pivot,则arr[r] == pivot
// r和l会一直交换最外层的while死循环;所以要每交换一次,前移r, 后移l,直到l>=r,跳出循环
if (arr[l] == pivot) {
r -= 1;
}
if (arr[r] == pivot){
l += 1;
}
}
//第三步:分组后分别开始左右递归
if