右边的数应该比pivot大,左边的数应该比pivot小
所以当右边的数比pivot小的时候,此时右指针应该停下来,将右指针指向的数移到左边去,nums[left]=nums[right]
当左边的数比pivot大的时候,此时左指针应该停下来,将左指针指向的数移到右边去,nums[right]=nums[left]
最后左右指针相遇,将pivot赋值给此时指向的位置数nums[left]或者nums[right]=pivot
第一趟排序后的结果:
最后把pivot填到空的位置
所以第一趟排序后的结果是 27 38 13 49 76 97 65 49
例题:2014 有一组数据{43,21,52,60,12,15},利用快速排序,以第一个元素作为基准得到一次划分的结果为:
A.15,21,12,43,52,60 B.15,12,21,43,52,60
C.12,15,21,43,60,52 D.15,21,12,43,60,52
最后将pivot填到空的位置
所以第一趟排序后的结果是15,21,12,43,60,52 选D
代码实现:
public void quickSort(int[] nums,int left,int right)
{
if(left>=right) return;
int i = left, j = right;
int pivot = nums[i]; //第一个数作为pivot
while(i < j)
{
while(i<j&&nums[j]>=pivot) //目的是找出比pivot小的数,右指针指向的数比pivot大,那就右指针一直左移
{
j--;
}
nums[i] = nums[j]; //将右指针指向的数移到左边
while(i<j&&nums[i]<pivot) //目的是找到比pivot大的数,左指针指向的数比pivot小,那就左指针一直右移
{
i++;
}
nums[j] = nums[i]; //左指针指向的数移到右边
}
nums[j] = pivot; //最后,将pivot的值赋给nums[i]或者是nums[j]
quickSort(nums,left,i);
quickSort(nums,i+1,right);
}
力扣912 排序数组 将一个数组升序排列
class Solution
{
public int[] sortArray(int[] nums)
{
quicksort(nums,0,nums.length-1);
return nums;
}
public void quicksort(int[] nums,int left,int right)
{
if(left>=right) return;
int pivot=nums[left];
int i=left,j=right;
while(i<j)
{
//跳出循环,说明在右边找到一个比pivot小的数,把这个数放到左边去
while(nums[j]>=pivot&&i<j)
{
j--;
}
nums[i]=nums[j];
//跳出循环,说明在左边找到一个比pivot大的数,把这个数放到右边去
while(nums[i]<=pivot&&i<j)
{
i++;
}
nums[j]=nums[i];
}
nums[i]=pivot;
quicksort(nums,left,i-1);
quicksort(nums,i+1,right);
}
}