码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序

时间:2021-03-12 14:17:58      阅读:0      评论:0      收藏:0      [点我收藏+]

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

快速排序

原理:递归+分治

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

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

技术图片

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

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

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

i<j 说明遍历还未完成,则将 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 < right) {//保证至少有两个元素要进行比较
            int mid = devide(arr, left, right);
            quickSort(arr, left, mid - 1);
            quickSort(arr, mid + 1, right);
        }
    }

//划分函数
private static int devide(int[] arr, int left, int right) {
        int i = left;
        int j = right - 1;
        int pivot = arr[right];
        while (true) {
            while (i < j && arr[i] <= pivot) i++;
            while (i < j && arr[j] >= pivot) j--;
            if (i < j) {
                swap(arr, i, j);
            } else {
                break;
            }
        }
        if (arr[i] > arr[right]) {
            swap(arr, i, right);
        }
        return i;
    }

快速排序

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

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!