首页 > 其他分享 >912. 排序数组---快速排序

912. 排序数组---快速排序

时间:2023-12-20 12:13:58浏览次数:23  
标签:gt end nums int quicksort --- start 排序 912

1.题目介绍

给你一个整数数组 \(nums\),请你将该数组升序排列。

示例 1:

输入:nums = [5,2,3,1]
输出:[1,2,3,5]

示例 2:

输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

提示:

  • \(1 <= nums.length <= 5 * 10^{4}\)
  • \(-5 * 10^{4} <= nums[i] <= 5 * 10^{4}\)

2.题解

2.1随机化快速排序

思路

代码

2.2双路快速排序

思路

使用两个索引值(i、j)用来遍历我们的序列,将 <=v 的元素放在索引 i 所指向位置的左边,而将 >=v 的元素放在索引 j 所指向位置的右边,平衡左右两边子数组。
image

代码

class Solution {
    public int[] sortArray(int[] nums) {
        quicksort(nums,0,nums.length-1);
        return nums;
    }

    public void swap(int[] nums, int i, int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

    public void quicksort(int[] nums, int start, int end){
        if (start > end) return;
        int v =  new Random().nextInt(end-start+1)+start;
        swap(nums,v,start);
        int ans = nums[start];
        int i = start, j = end;
        // 进行一轮循环
        while (start != end){
            // end开始逆向寻找比基准数小的
            while (true){
                if (start >= end || nums[end] < ans) break;
                end--;
            }
            // start开始正向寻找比基准数大的
            while (true){
                if (start >= end || nums[start] > ans) break;
                start++;
            }
            // 交换两数
            swap(nums,start,end);
        }
        // 结束一轮循环,将基准数与start/end当前所在位置交换
        swap(nums,i, start);
        quicksort(nums,i,start-1);
        quicksort(nums,start+1,j);
    }
}

2.3三路快速排序

思路


我们分三种情况进行讨论 partiton 过程,i 表示遍历的当前索引位置:

(1)当前处理的元素 e=V,元素 e 直接纳入蓝色区间,同时i向后移一位。
image

(2)当前处理元素 e<v,e 和等于 V 区间的第一个位置数值进行交换,同时索引 lt 和 i 都向后移动一位
image

(3)当前处理元素 e>v,e 和 gt-1 索引位置的数值进行交换,同时 gt 索引向前移动一位。
image

最后当 i=gt 时,结束遍历,同时需要把 v 和索引 lt 指向的数值进行交换,这样这个排序过程就完成了,然后对 <V 和 >V 的数组部分用同样的方法再进行递归排序。

代码

class Solution {
    public int[] sortArray(int[] nums) {
        quicksort(nums, 0, nums.length - 1);
        return nums;
    }

    public void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

    public void quicksort(int[] nums, int low, int high) {
        if (low >= high) {
            return;
        }

        int pivot = nums[low];
        int lt = low;   // less than pivot
        int gt = high;  // greater than pivot
        int i = low + 1;

        while (i <= gt) {
            if (nums[i] < pivot) {
                swap(nums, i, lt);
                lt++;
                i++;
            } else if (nums[i] > pivot) {
                swap(nums, i, gt);
                gt--;
            } else {
                i++;
            }
        }

        quicksort(nums, low, lt - 1);
        quicksort(nums, gt + 1, high);
    }
}

标签:gt,end,nums,int,quicksort,---,start,排序,912
From: https://www.cnblogs.com/trmbh12/p/17916239.html

相关文章

  • 【UVCAD】- 图层的使用教程
    【UVCAD】手机二维CAD建模,不止是看图,还提供了数十种工具用了创建和修改图形。UVCAD专注于二维(2D)的移动计算机辅助绘图(CAD)。UVCAD具有触摸优化的直观界面和工具。使用UVCAD,您可以在触摸屏上用手指或触控笔进行真正的2D绘图、2D建模和2D设计。对于需要易于使用的工具来在移动设备上更......
  • Java零基础-反射
    前言Java是目前最流行的开发语言之一,在软件开发领域广泛应用。反射是Java的一项重要特性,它使得程序在运行时可以动态地获取和操作类、方法、属性等信息,极大地提高了Java的灵活性和可扩展性。本文将介绍Java反射的基本概念、使用方法、应用场景和优缺点,旨在为Java初学者提供一份简......
  • 详解十大经典排序算法(五):归并排序(Merge Sort)
    算法原理归并排序的核心思想是将一个大的数组分割成多个小的子数组,然后分别对这些子数组进行排序,最后将排序后的子数组合并起来,得到一个有序的大数组。算法描述归并排序(MergeSort)是一种经典的排序算法,其原理基于分治(DivideandConquer)策略。它的核心思想是将一个大问题分割成多个......
  • 详解十大经典排序算法(四):希尔排序(Shell Sort)
    算法原理希尔排序是一种基于插入排序的排序算法,也被称为缩小增量排序。它通过将待排序的序列分割成若干个子序列,对每个子序列进行插入排序,然后逐步缩小增量,最终使整个序列有序。算法描述希尔排序(ShellSort)是一种基于插入排序的算法,由DonaldShell于1959年提出。它是插入排序的一种......
  • 2023-12-14 早就想写的,关于自己的不敢索取,不敢要,别人问我要,很烦躁
    2023-12-14   本想记录下之前把一个微信好友删了的事情。拖延了一段时间。   一个佛友,老问我索取,问我借钱,要钱。我感觉不耐烦,就删了。我为什么不耐烦?一则是前先时候确实没钱,给不起。另外我给别人没什么问题,别人问我要,我就不太愿意给。   我不敢索取,不敢要。别......
  • 2023-12-20 如何改变,抄并记录
    2023-12-20如何改变我们的人格特质,改变我们的性格,蜕变自己?一、人格特性六岁之前形成80%,是你在神经系统没有发育成熟的情形下,很多你搜集的信息没有经过你意识的过滤而储存在潜意识里,所以你的人格特质受潜意识影响。二、随着你的学习,你掌握了知识和技能,这个时候刺激了你的大脑,塑......
  • 使用阿里云oss报错:com.alibaba.cloud:aliyun-oss-spring-boot-starter:jar:unknown wa
    根据阿里云OSS的案例文档,在springboot项目中配置pom时报错https://github.com/alibaba/aliyun-spring-boot/tree/master/aliyun-spring-boot-samples/aliyun-oss-spring-boot-sampledemo中的配置:<dependency><groupId>com.alibaba.cloud</groupId>......
  • 【GiraKoo】Oh-my-posh加载速度慢
    【解决方案】Oh-my-posh加载速度慢背景说明最近沉迷于美化控制台。Oh-my-posh应该是其中做的比较出色的。可惜在本地使用时。加载速度异常缓慢.启动程序需要600ms,甚至是1s以上。立刻就劝退了我。但是尝试了其他美化工具之后。慢慢发现,这个现象并不只是Oh-my-posh……于是,开......
  • a-tree-select的使用案例
    <a-tree-select:maxTagCount="6"@deselect="deSelectQueryDetailTreeData"@select="initQueryDetailTreeData"style="width:270px"v-mod......
  • Could not build wheels for pillow, which is required to install pyproject.toml-b
     参考来源,致敬大佬。ERROR:CouldnotbuildwheelsforPillow,whichisrequiredtoinstallpyproject.toml-basedprojects-CSDN博客报错:Couldnotbuildwheelsforpillow,whichisrequiredtoinstallpyproject.toml-basedprojects的解决-CSDN博客 本人小白......