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

912. 排序数组

时间:2024-11-11 10:10:53浏览次数:1  
标签:right nums int vector 数组 left 排序 border 912

  1. 题目链接

  2. 本题使用的是快排解决。

  3. 思路:「荷兰国旗」问题,具体思路跳转75. 颜色分类

  4. 代码

    class Solution {
    public:
    
        void swap(vector<int>& nums, int i, int j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }
        // [L, R]上排序
        void quickSort(vector<int>& nums, int L, int R) {
            if (L >= R) {
                return;
            }
            int left_border = L - 1;       // [L, left_border]小于区域
            int right_border = R + 1;      // [right_border, R]大于区域
            int i = L;
            // 这里很重要,不然会因为数据情况退化成O(n^2)
            int random_index = L + rand() % (R - L + 1);   // 随机取值划分
            int num = nums[random_index];   
            while(i < right_border) {
                if (nums[i] == num) {
                    i++;
                } else if(nums[i] < num) {   // 「发货」到小于区域
                    swap(nums, i, left_border + 1);
                    i++;
                    left_border++;
                } else {     // 「发货」到大于区域
                    swap(nums, i, right_border - 1);
                    right_border--;
                    // 注意这里i不能动
                }
            }
    
            // [L, left_border]小于区域
            // [left_border + 1, right_border - 1] 等于区域 已经有序了
            // [right_border, R]大于区域
            quickSort(nums, L, left_border);    // 小于区域继续快排
            quickSort(nums, right_border, R);    // 大于区域继续快排
    
        }
    
        vector<int> sortArray(vector<int>& nums) {
            quickSort(nums, 0, nums.size() - 1);
            vector<int> ans = nums;
            return ans;
        }
    };
    

标签:right,nums,int,vector,数组,left,排序,border,912
From: https://www.cnblogs.com/ouyangxx/p/18539200

相关文章

  • 关于我,穿越异世界,凭c语言搅动风云vlog----利用数组进行大数相关计算
    关于我,穿越异世界,凭c语言搅动风云vlog----利用数组进行大数相关计算一.有关大数你应该要知道的那些事1.大数的概念我们一般将计算机基本数据类型无法存储的数称之为大数,本文涉及的大数均为整数,不包含小数。而且下文代码实现中的数组大小可根据需要修改。2.问题引入在c......
  • 53. 最大子数组和
    题目链接解题思路最大子数组问题,有两个基本的想法,以i开头的子数组结果是怎样的,求出所有的结果,最优的那个,就是答案;以i结尾的子数组结果是怎样的,求出所有的结果,最优的那个,就是答案。本题我们可以考虑,「以i结尾的结果是怎样的」,为啥?因为我们要求的是最大的累加和,我们求出了re......
  • 工作学习笔记(五)数组
    在Java中,数组有以下重要作用:存储数据可以将同类型的多个数据组合在一起。例如,存储一个班级学生的考试成绩。如果有50个学生,就可以创建一个 int 类型的数组 int[]scores=newint[50]; 来存放所有成绩。除了基本数据类型,也能存储对象。比如, String[]names=newStri......
  • 选择排序
    选择排序的排序方法通过\(2\)重循环遍历数组,发现有不符合顺序的数对,就交换他们.时间复杂度选择排序的最好时间复杂度:\(\Theta(n^2).\)选择排序的平均时间复杂度:\(\Theta(n^2).\)选择排序的最坏时间复杂度:\(\Theta(n^2).\)稳定性选择排序是不稳定的排序算法.示......
  • 如果你搞不懂排序,看这篇文章就对了,初学者也看得懂,其三:进阶插入排序——希尔排序
    目录一.希尔排序1.1希尔排序的原理1.2希尔排序的代码思路1.3希尔排序的代码实现1.1希尔排序的原理希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重......
  • 实验4 C语言数组应用编程
    实验任务1:task1.c源代码:1#include<stdio.h>2#defineN43#defineM245voidtest1(){6intx[N]={1,9,8,4};7inti;89printf("sizeof(x)=%d\n",sizeof(x));1011for(i=0;i<N;++i)......
  • 一道题把我气笑了:) 力扣.53 最大子数组和 leetcode maximum-subarray
    数组系列力扣数据结构之数组-00-概览力扣.53最大子数组和maximum-subarray力扣.128最长连续系列longest-consecutive-sequence力扣.1两数之和N种解法two-sum力扣.167两数之和IItwo-sum-ii力扣.170两数之和IIItwo-sum-iii力扣.653两数之和IVtwo-sum-IV力......
  • 实验4 c语言数组应用编程
    task1:1#include<stdio.h>2#include<stdlib.h>3#defineN44#defineM2567voidtest1(){8intx[N]={1,9,8,4};9inti;1011printf("sizeof(x)=%d\n",sizeof(x));1213for(i=0;i<N;++i)14......
  • 冒泡排序(详细讲解)
    对于冒泡排序,字面理解就是对一段数据进行排序比如说你有10个数据intarr[10]={3,1,7,5,8,9,0,2,4,6};你想对这些数据进行从小到大的排序,一个个用if和else去进行比较太麻烦了,所以这时候冒泡排序就可以帮你提高效率首先,先文字讲解,这里总共有十个数据,而我们每次排序都会将......
  • 4-2-2.C# 数据容器 - HashSet 扩展(HashSet 集合操作、HashSet 存储对象的特性、HashSe
    HashSet概述HashSet<T>存储的元素是无序的HashSet<T>存储的元素是不可重复的HashSet<T>支持泛型,可以指定存储的元素的类型HashSet<T>不支持索引,不可以通过索引获取或修改元素HashSet<T>不是线程安全的,在多线程环境中需要谨慎使用一、HashSet集合操作1......