力扣 912. 排序数组

news/2025/2/21 7:58:53/

文章目录

  • 一、题目描述
  • 二、题解
    • 1.快速排序
    • 2.堆排序
    • 3.二路归并排序


一、题目描述

给你一个整数数组 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.快速排序

快速排序,时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn),空间复杂度 O ( log ⁡ n ) O(\log n) O(logn)

class Solution {
public:vector<int> sortArray(vector<int> &nums) {quickSort(nums, 0, nums.size() - 1);return nums;}private:void quickSort(vector<int> &nums, int begin, int end) {if (begin < end) {int pivot = partition(nums, begin, end);quickSort(nums, begin, pivot - 1);quickSort(nums, pivot + 1, end);}}int partition(vector<int> &nums, int begin, int end) {int pivot_num = nums.at(begin);while (begin < end) {while (begin < end && nums.at(end) >= pivot_num) {end--;}nums.at(begin) = nums.at(end);while (begin < end && nums.at(begin) <= pivot_num) {begin++;}nums.at(end) = nums.at(begin);}nums.at(begin) = pivot_num;return begin;}
};

2.堆排序

堆排序,时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn),空间复杂度 O ( 1 ) O(1) O(1)

class Solution {
public:vector<int> sortArray(vector<int> &nums) {buildMaxHeap(nums);for (int i = static_cast<int>(nums.size() - 1); i >= 0; i--) {swap(nums.at(0), nums.at(i));heapAdjust(nums, 0, i);}return nums;}private:/*** 构建大根堆*/void buildMaxHeap(vector<int> &nums) {for (int i = static_cast<int>(nums.size()) / 2 - 1; i >= 0; i--) {heapAdjust(nums, i, static_cast<int>(nums.size()));}}/*** 调整以root为根的二叉树* @param nums 存储二叉树元素的数组* @param root 根节点* @param len 包括根节点在内要调整的元素总数*/void heapAdjust(vector<int> &nums, int root, int len) {int tmp = nums.at(root);  // 本轮需要被筛选的值/* 从root的孩子开始逐层向下调整 */for (int child = 2 * root + 1; child < len; child = 2 * child + 1) {/* 选取两个孩子中值较大的那个节点与父节点进行比较 */if ((child + 1) < len && nums.at(child + 1) > nums.at(child)) {child++;}/* 如果两个孩子都不大于当前根节点,则结束当前层的调整* 如果某一个孩子大于当前根节点,则将该孩子换到当前根上 */if (nums.at(child) <= tmp) {break;} else {nums.at(root) = nums.at(child);root = child;  // 提前准备下一层循环}}/* 将筛选的值放到最终位置上 */nums.at(root) = tmp;}
};

3.二路归并排序

二路归并排序,时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn),空间复杂度 O ( n ) O(n) O(n)

class Solution {
public:vector<int> sortArray(vector<int>& nums) {mergeSort(nums, 0, static_cast<int>(nums.size() - 1));return nums;}private:void mergeSort(vector<int> &nums, int begin, int end) {if (begin < end) {int mid = begin + (end - begin) / 2;mergeSort(nums, begin, mid);mergeSort(nums, mid + 1, end);merge(nums, begin, mid, end);}}/*** 将两个子数组合并为一个大数组* @param nums 数据* @param begin 第一个子数组的起始元素下标* @param mid 第一个子数组的结束元素下标,它后面一个元素即为第二个子数组的起始元素* @param end 第二个子数组的结束元素下标*/void merge(vector<int> &nums, int begin, int mid, int end) {vector<int> supply(nums.size());  // 辅助数组int i, before, after;/* 将数据从nums中拷贝到records中 */for (i = begin; i <= end; i++) {supply.at(i) = nums.at(i);}/* 依次将两个子数组的最小值复制到大数组中 */for (before = begin, after = mid + 1, i = begin; before <= mid && after <= end; i++) {if (supply.at(before) < supply.at(after)) {nums.at(i) = supply.at(before++);} else {nums.at(i) = supply.at(after++);}}/* 处理剩余数据 */while (before <= mid) {nums.at(i++) = supply.at(before++);}while (after <= end) {nums.at(i++) = supply.at(after++);}}
};

在这里插入图片描述


http://www.ppmy.cn/news/297202.html

相关文章

老妈炒股专用机入手

由于大二&#xff08;貌似00年暑假&#xff09;配的那台计算机如今的缓慢无比&#xff08;从开机到进入系统后所有程序完全加载完毕需要7-8分钟&#xff0c;好歹当年也是雷鸟1G啊&#xff0c;竟然落的个如此下场&#xff09;&#xff0c;老妈这个典型的急性子终于忍受不了开机后…

液晶内存带头 诸多其它配件价格也大涨

PConline产业资讯上海专稿[文/陶美坤] 近期市场中涨价的不止液晶显示器和内存条&#xff0c;实际上还有更多的配件出现了涨价的势头。正是由于如此之多的配件涨价都集中到了一起&#xff0c;使得现在DIY市场的整体涨幅有些偏高&#xff0c;一台5000元左右的主流整机配置相对涨…

昨日看见小学生上学,想起我的学生时代

起由&#xff1a; 早上上班的时候&#xff0c;发现路旁很热闹。原来有很多小学生等上学的小车。“上学”原来今天是9.1号&#xff0c;继续走还要赶公交。最近的1rmb的503公交很难挤&#xff0c;到了我等的那个站台总数不停。每来一辆车总是黑压压的一遍。走了3分钟到了&#xf…

备战2月面试8家大厂,成功上岸字节(Java岗)定级T2-2,分享一下我的面试心得

最近在公众号上看到一位道友的字节面经&#xff0c;可以说是深有感触了&#xff01; 他的背景是杭州某中厂的Java后端开发&#xff0c;本科毕业5年&#xff0c;最近2个月面试了PDD、小红书、字节等多个大厂。几乎都拿到了Offer&#xff0c;最终选择了字节2-2。以下是他的一些分…

fc6下 显卡(NVIDIA GeForce 7100 GS)的安装

1、从http://www.nvidia.com/网站下载相对应的源代码 http://us.download.nvidia.com/XFree86/Linux-x86/1.0-9755/NVIDIA-Linux-x86-1.0-9755-pkg1.run 2、这个驱动程序的安装需要非X window下面安装&#xff0c;可以在图形界面下终端里运行 init 33、运行sh NVIDIA-Linux-…

服务器主板上一个处理器性能如何,怎么判断一个CPU才算好

我们作为一个电脑用户新手来说&#xff0c;购买一个好的电脑配置能让我们体验更好的电脑。作为一个电脑核心CPU来说是非常重要的&#xff0c;不过大家是新手却不知道如何判断一个CPU的好坏。所以学习啦小编这里就给大家上一堂关于如何选择一个好的CPU的课。 首先学习啦小编要给…

Ubuntu Linux安装问题

Ubuntu Linux安装问题 一.设置中文环境与中文输入法 Ubuntu系统默认采用的是GNOME集成桌面环境&#xff0c;GNOME致力于提供简洁、高效的界面和统一的开发平台&#xff0c;Ubuntu系统中的GNOME版本为2.22.3。我们这里设置中文环境及中文输入法也是针对GNOME集成桌面环境而言的…

amd c6 support_完胜690!最详尽的C68G芯片组性能评测

1前言——C68G芯片组规格详解 前言&#xff1a; 在刚过去的三月装机旺季中&#xff0c;采用AMD推出没多久的690G(RS690)主板大放异彩。究其原因&#xff0c;除了三月本身是电脑销售旺季外&#xff0c;AMD 690G主板附带的HDMI和DVI视频输出接口是其热卖的一大原因之一。 我们在来…