当前位置: 首页 > news >正文

LeeCode912. 排序数组

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

你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。

    示例 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 * 104
    • -5 * 104 <= nums[i] <= 5 * 104

    代码:

    #include "solution.h"
    #include <algorithm>
    #include <vector>
    #include <set>
    #include <stdlib.h>static void swapeValue(int& a, int& b) {int temp = a;a = b;b = temp;
    }static int getMiddleVal(int a, int b, int c) {int arr[] = {a, b, c};// 等号右边是lambda表达式,表示一个匿名函数,参数是俩个指针,返回int值。 符号 ->int 可省略,能自动推导出返回值类型auto compareFuc = [](const void* p1, const void* p2) ->int {return *((int*)p1) - *((int*)p2);};// 这里c语言的qsort函数,只排序a,b,c 3个数。这里偷个懒了qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), compareFuc);return arr[1];
    }// 将数组这个区间分成左右两个区间,返回中间数的idx,左边区间的所有数小于idx索引处的数,右边区间的数都大于idx索引处的数
    // 为了找到这个idx,过程中可以交换一些数的值。
    static int getIdx(vector<int>& nums, int startIdx, int endIdx) { static auto flag = true; // 有很多相同数字时,超时!为解决这个问题,引入变量flag,让中间值尽量处在区域中间的某个位置if (startIdx == endIdx - 1) {// 相邻的if (nums[endIdx] < nums[startIdx]) {int temp = nums[startIdx];nums[startIdx] = nums[endIdx];nums[endIdx] = temp;}return startIdx;}// 尽量用区域中间某个值作为分界线int idx = startIdx;int midIdx = (startIdx + endIdx) >> 1;int middleVal = getMiddleVal(nums[startIdx], nums[midIdx], nums[endIdx]);int idx_ = startIdx; // 中间那个值对应的索引if (nums[midIdx] == middleVal) {idx_ = midIdx;}else if (nums[endIdx] == middleVal) {idx_ = endIdx;}if (idx_ != idx) {swapeValue(nums[idx], nums[idx_]);}for (int i = startIdx + 1; i <= endIdx; i++) {if (nums[i] < nums[idx] || (flag && nums[i] == nums[idx])) {// 交换nums[i]和 nums[idx + 1]的值// 交换nums[idx] 和nums[idx + 1]的值。// idx值+1// 这样,那个小的值就交换到前面了swapeValue(nums[i], nums[idx + 1]);swapeValue(nums[idx], nums[idx + 1]);++idx;flag = !flag;}}return idx;
    }void qsort(vector<int>& nums, int startIdx, int endIdx) {if (startIdx >= endIdx)return;int idx = getIdx(nums, startIdx, endIdx);qsort(nums, startIdx, idx - 1);qsort(nums, idx + 1, endIdx);
    }class Solution {
    public:vector<int> sortArray(vector<int>& nums) {if (nums.size() < 2) {return nums;}qsort(nums, 0, nums.size() - 1);return nums;}
    };

     测试代码:

    void testLeeCode912() { // 排序数组vector<int> nums = {5, 2, 3, 1};Solution* solution = new Solution();solution->sortArray(nums);for (auto& val : nums) {std::cout << val << endl;}delete solution; // 回收内存
    }

    测试结果:

    ok!

    提交到LeeCode:

    ok!

    总结:总体方法是分段排序。需要将数组分为俩个区域,有中间的一个数,左边的数都小于这个数,右边的数都大于这个数,再对递归每个区域用同样方法。 但是特殊情况容易超时,比如数组是倒序的,或者数组多数数字都一样的情况,这俩种递归次数太多,然后一步步优化。


    文章转载自:

    http://XDkyAzo4.djcbt.cn
    http://VQ8P4SDC.djcbt.cn
    http://fac4OsHN.djcbt.cn
    http://LuSrrEpE.djcbt.cn
    http://azmxDsym.djcbt.cn
    http://NVE4P8ya.djcbt.cn
    http://jB9NI1Nd.djcbt.cn
    http://im41SUXb.djcbt.cn
    http://togmnvFW.djcbt.cn
    http://7iHPFJSO.djcbt.cn
    http://6YOJDxsw.djcbt.cn
    http://jztOAeEj.djcbt.cn
    http://5InCmcIJ.djcbt.cn
    http://hBX9xayc.djcbt.cn
    http://9GvOJ8iG.djcbt.cn
    http://ZGhhuhye.djcbt.cn
    http://ITiV0nrj.djcbt.cn
    http://hEWtFpoc.djcbt.cn
    http://QLgc8w3v.djcbt.cn
    http://e4YjAkGd.djcbt.cn
    http://y770nOzv.djcbt.cn
    http://yudWN2Uq.djcbt.cn
    http://oOpRnlfQ.djcbt.cn
    http://3Vt9P6n5.djcbt.cn
    http://jndVe4EN.djcbt.cn
    http://JS8YlCas.djcbt.cn
    http://lj0nfhA9.djcbt.cn
    http://1pbI8nOg.djcbt.cn
    http://WK94Ewkm.djcbt.cn
    http://S6fKdrI7.djcbt.cn
    http://www.dtcms.com/a/142019.html

    相关文章:

  1. AUTOSAR图解==>AUTOSAR_SWS_CryptoInterface
  2. 神经接口安全攻防:从技术漏洞到伦理挑战
  3. 不一样的flag 1(迷宫题)
  4. 【专题刷题】双指针(四):最接近的三数之和,接雨水
  5. 关于防火墙
  6. Python读取Excel表格数据并写成JSON格式文件(精简版)
  7. Zookeeper 概述
  8. 【SAP ME 42】SAP ME 性能改进
  9. LIMS引领综合质检中心数字化变革,赋能质量强国战略
  10. 单线服务器有什么优点
  11. Vue3 实战:打造多功能旅游攻略选项卡页面
  12. 大模型转换为 GGUF 以及使 用 ollama 运行
  13. Maven 简介(图文)
  14. 幽灵依赖与常见依赖管理
  15. ObjectOutputStream 深度解析
  16. 2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(三级)答案 + 解析
  17. AI测试用例生成平台
  18. uni.createInnerAudioContext踩坑duration在真机环境一直为0
  19. PostgreSQL 通过 copy 命令导入几何数据 及 通过 CopyManager.copyIn() 导入几何数据
  20. PH热榜 | 2025-04-18
  21. 视频孪生技术赋能城市内涝灾害智慧化建设
  22. 直播人脸美型核心技术详解:卷积神经网络与图像增强在美颜SDK中的应用
  23. 什么是爬虫?——从技术原理到现实应用的全面解析
  24. STM32F7安全库各版本发布内容的表格化中文总结
  25. C++——C++11常用语法总结
  26. CentOS 7系统yum报错解决方案(CentOS 7官方EOL问题修复)
  27. 使用droidrun库实现AI控制安卓手机
  28. Python读取Excel表数据转为JSON格式文件(详细优化版)
  29. 软件研发技术团队管理规范
  30. 怎么隐藏QTabWidget内的页面