美文网首页算法
03-快速排序

03-快速排序

作者: 唔哒喂 | 来源:发表于2021-09-03 15:40 被阅读0次

使用递归。顺序设为从小到大。
完整代码见文章最后。

函数设置为

public static void QuickSort(int[] arr, int L, int R)

每次取一个值作为标准值(可取左边界的值)
同时需要有两个参数即当前处理分组的左右边界。设为L和R。
(第一次调用则为0和length-1)

        int temp = arr[L];
        int left = L;
        int right = R;

已经取这个left位置的值,所以此时可以将arr[left]存的数据视为空。只是人为视为空。

从右向左遍历寻找 arr[right] < temp。如果此时right仍在left右侧,即大于left
即可将arr[left] = arr[right]。

while(arr[right] >= temp && right > left)
                right--;
 if (right > left)
                arr[left] = arr[right];

此时可以将right存的值视为空,开始寻找arr[left] > temp。
当arr[left] > temp时,arr[right] = arr[left]

 // 开始找左边即比temp大的值
            while(arr[left] < temp && left < right)
                left++;
//            同理需要先判定left是否仍小于right
            if (left < right)
                arr[right] = arr[left];

判断left和right是否重合,如果重合则将重合位置设为temp

 if (left >= right)
                arr[left] = temp;

重复上述操作直到left和right重合。
可将上述操作放入一个循环中。

while(true){
//            先比较right, 直到找到比temp小的数据
            while(arr[right] > temp && right > left)
                right--;

//            先判断right 是否仍大于 left,如果true则表示已经找到比temp小的数据
            if (right > left)
                arr[left] = arr[right];

            // 开始找左边即比temp大的值
            while(arr[left] < temp && left < right)
                left++;
//            同理需要先判定left是否仍小于right
            if (left < right)
                arr[right] = arr[left];

//            这一步即left和right已重合
            if (left == right)
                arr[left] = temp;
                break;
        }

一次排序已经排完。

这时在left与right重合点左侧的值均小于 temp,右侧大于temp。

之后分别对左侧和右侧的数据再次按照上述排序。
直到传入的left在right右侧或重合(left>=right),说明这次最多只有一个数据,已经完成排序

//        left right 重合 左<temp   右>temp
//        再对左右执行上述过程
        QuickSort(arr, L, left - 1);
        QuickSort(arr, left + 1, R);

在本函数进行循环前加上判断是否只有一个数据

//        如果L已经大于等于R了则直接返回
        if (L>=R)
            return;

完整代码

public static void QuickSort(int[] arr, int L, int R){
//        如果L已经大于等于R了则直接返回
        if (L>=R)
            return;

        //        从小到大。
        int temp = arr[L];
        int left = L;
        int right = R;
        while(true){
//            先比较right, 直到找到比temp小的数据
            while(arr[right] >= temp && right > left)
                right--;

//            先判断right 是否仍大于 left,如果true则表示已经找到比temp小的数据
            if (right > left)
                arr[left] = arr[right];

            // 开始找左边即比temp大的值
            while(arr[left] < temp && left < right)
                left++;
//            同理需要先判定left是否仍小于right
            if (left < right)
                arr[right] = arr[left];

//            这一步即left和right已重合
            if (left == right){
                arr[left] = temp;
                break;
            }

        }
//        left right 重合 左<temp   右>temp
//        再对左右执行上述过程
        QuickSort(arr, L, left - 1);
        QuickSort(arr, left + 1, R);

    }

相关文章

  • 03-快速排序

    使用递归。顺序设为从小到大。完整代码见文章最后。 函数设置为 每次取一个值作为标准值(可取左边界的值)同时需要有两...

  • 七大排序算法之快速排序

    七大排序算法之快速排序 @(算法笔记)[排序算法, 快速排序, C++实现] [TOC] 快速排序的介绍: 快速排...

  • 面试准备--排序

    堆排序 快速排序(simple) 快速排序(regular) 归并排序 Shell排序 插入排序 选择排序 冒泡排序

  • 排序

    插入排序 选择排序 冒泡排序 归并排序 快速排序* 三路快速排序

  • 算法笔记01-排序#2

    快速排序敢叫快速排序,那它一定得快。 快速排序 概述 快速排序也是分治排序的典型,它快,而且是原地排序。不过,要防...

  • PHP 实现快速排序

    导语 这篇了解下快速排序。 快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-...

  • 快速排序的Python实现

    目录 快速排序的介绍 快速排序的Python实现 快速排序的介绍 快速排序(quick sort)的采用了分治的策...

  • 数据结构与算法 快速排序

    起因:快速排序,又称分区交换排序,简称快排,之前没有了解过,抽空学习一下。 快速排序 1 快速排序 快速排序的定义...

  • 数组-快速排序

    采用快速方式对数组进行排序 快速排序百科:快速排序(Quicksort)是对冒泡排序算法的一种改进.快速排序是通过...

  • OC数据结构&算法

    更多整理资料尽在?一平米小站 目录 选择排序 冒泡排序 插入排序 快速排序 双路快速排序 三路快速排序 堆排序 选...

网友评论

    本文标题:03-快速排序

    本文链接:https://www.haomeiwen.com/subject/zvthwltx.html