快速排序

2021-06-08 18:03

阅读:457

标签:png   load   遍历   while   默认   swa   代码实现   stat   code   

快速排序

原理:递归+分治

从数组中选取一个基准点,将数组中小于这个基准点的元素放到基准点左边,大于这个基准点的元素放到右边

默认每次选取最后一个元素当作基准点,定义变量i,j分别指向数组的左端和右端前一个元素

技术图片

i 向右移动扫描比基准点大的数, 如果比基准点小或等于则继续移动,

j 向左移动扫描比基准点小的数,如果比基准点大或等于则继续移动,

i,j要么是 i ,要么是 i = j

i 说明遍历还未完成,则将 i,j元素交换位置

技术图片

交换完成后,如果 i 还是小于 j 则说明遍历还未完成,i,j 继续移动,如果满足条件继续交换元素

技术图片

如果 i=j,说明遍历完成,已经将所有小的数放到了基准点左边,大的数放到了基准点的右边

则,判断 i,j指向的数是否大于基准点,如果大于,交换 i 和基准点

技术图片

此时 i,j指向的数就是新的基准点,基准点左边的数都小于它,基准点右边的数都大于它,

此时一轮排序完成,将新的基准点返回,此时数组被分割成了两段,将左边和右边的元素传入递归调用

分别选定基准点并进行划分,这个划分的流程跟上面的一致,但是数组的规模变小了,这就是分治的思想。

技术图片

左递归

技术图片

右递归

技术图片

最后一次,以15为基准点,i,j都指向10,此时不满足交换条件,则递归结束,至此所有数字就找到了应在的位置

代码实现

//交换函数
private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }


//入口函数
public static void quickSort(int[] arr, int left, int right) {
        if (left = pivot) j--;
            if (i  arr[right]) {
            swap(arr, i, right);
        }
        return i;
    }

快速排序

标签:png   load   遍历   while   默认   swa   代码实现   stat   code   

原文地址:https://www.cnblogs.com/fkPrograming/p/14521807.html


评论


亲,登录后才可以留言!