一、快速排序原理(从小到大)
1.基本思想
通过一趟排序将待排序列分成两部分,若一部分比另一部分小,则可继续对这两部分继续排序,从而使整个待排序列变得有序。
2.算法描述
1)将数组中的一个数字作为基准数
2)一般将数组中左边第一个数字作为基准数,然后从两边开始遍历,左边找比基准数大的,右边找比基准数小的,都找到后交换两个数的位置,当两指针相遇时,将指针所指向的数于基准数交换,然后数组被分成了两部分。
3)递归地对上一步分出的两数组进行排序。
3.图示
这里只展示一轮,后续过程类似。
开始遍历
两边都遍历到,交换两数的位置
继续遍历
同样交换两数位置
继续遍历,两指针相遇
将两指针共同指向的数与及基准数交换位置
第一轮完成,此时基准数6的位置的有序的,数组被分成了两部分,左边的比基准数小,右边的比基准数大,对数组分成的两部分递归运用此方法即可得到有序数组
二、代码实现
public static void main(String[] args) {
int[] nums = new int[]{6,1,2,5,4,3,9,7,10,8};
quickSort(nums,0, nums.length - 1);
System.out.println(Arrays.toString(nums));
}
public static void quickSort(int[] nums,int left,int right){
//进行判断 如果左边索引比右边的索引要大 是不合法的 直接使用 return 结束这个方法
if(left >= right){
return;
}
//基准数
int base = nums[left];
//i指向最左边
int i = left;
//j指向最右边
int j = right;
while (i != j){
//先由j 从 右向左检索比基准数小的,如果检索到比基准数小的就停下
while (nums[j] >= base && i < j){
j--;
}
// i 从左向右检索
while (nums[i] <= base && i < j){
i++;
}
//代码走到这里。i 和 j 都停下了,然后交换 i 和 j的位置元素
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
// 如果while循环条件不成立,这就代表了 i和 j相遇了,就停止检索
//交换基准数和这个相遇位置的元素进行交换
nums[left] = nums[i];
//把基准数赋值给相遇位置的元素
nums[i] = base;
//递归调用
quickSort(nums,left,i - 1);
quickSort(nums,j + 1,right);
}