文章目录

  • 一、题目描述
  • 二、题解
    • 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 low, int high) {int pivot_num = nums.at(low);while (low < high) {while (low < high && nums.at(high) >= pivot_num) {high--;}nums.at(low) = nums.at(high);while (low < high && nums.at(low) <= pivot_num) {low++;}nums.at(high) = nums.at(low);}nums.at(low) = pivot_num;return low;}
};

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) {nums.at(root) = nums.at(child);root = child;  // 提前准备下一层循环} else {break;}}/* 将筛选的值放到最终位置上 */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) {supply.reset(new vector<int>(nums.size()));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) / 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) {int front, back, i;/* 将数据从nums拷贝到辅助数组中 */for (i = begin; i <= end; i++) {supply->at(i) = nums.at(i);}/* 依次将两个子数组的最小值复制到大数组中 */for (front = begin, back = mid + 1, i = begin; front <= mid && back <= end; i++) {if (supply->at(front) < supply->at(back)) {nums.at(i) = supply->at(front++);} else {nums.at(i) = supply->at(back++);}}/* 处理剩余数据 */while (front <= mid) {nums.at(i++) = supply->at(front++);}while (back <= end) {nums.at(i++) = supply->at(back++);}}private:unique_ptr<vector<int>> supply = nullptr;  // 辅助数组
};

力扣 912. 排序数组相关推荐

  1. 力扣——在排序数组中查找元素的第一个和最后一个位置

    在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 如果数组中不存在目标值 target,返 ...

  2. 力扣删除排序数组中的重复项 II

    给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的 ...

  3. 力扣删除排序数组中的重复项

    给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条 ...

  4. 力扣34-在排序数组中查找元素的第一个和最后一个位置(Java,二分,附思路)

    思路: 用顺序查找很简单,但是logn解法就是用二分查找了,数组又是排好序的. nums[mid]和target不一样的情况与普通的二分查找并无二致,要找target出现的前后位置,那肯定就只是在相等 ...

  5. LeetCode 912. 排序数组(Java)

    912. 排序数组 你一个整数数组 nums,请你将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出:[1,2,3,5] 提示: 1 <= nums.length &l ...

  6. 力扣 两个数组的交集

    力扣 两个数组的交集 题目描述 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 示例 2: 输入:num ...

  7. 力扣练习题(数组中数据反转)

    力扣练习题(数组中数据反转) 要求:int[] arr = {12,23,34,45,56,67,78,89,90}; 变为:int[] arr = {90,89,78,67,56,45,34,23, ...

  8. Leetcode 912.排序数组(Sort an Array)

    Leetcode 912.排序数组 1 题目描述(Leetcode题目链接)   给定一个整数数组 nums,将该数组升序排列. 输入:[5,2,3,1] 输出:[1,2,3,5] 输入:[5,1,1 ...

  9. LeetCode 912. 排序数组【模板题】

    912. 排序数组 [快排] class Solution {// 快速排序 7:32 13void quickSort(int[] nums, int l, int r){if(l >= r) ...

最新文章

  1. python下载完以后是什么样子_python下载后怎么用
  2. 虚拟机克隆,并设置新的ip,配置hostname,配合hostname,hosts
  3. Django基础核心技术之Model模型的介绍与设计
  4. jquery去掉数组最后一个元素_从数组中删除最后一项
  5. 共轨之家获吉利家族基金新一轮融资 5个月前曾获磐霖资本领投A轮融资
  6. python之虚拟环境
  7. Linux查询root环境变量,linux环境变量和查看方法
  8. 手动安装Linux网卡驱动程序
  9. 精益画布_这6本书让你成为精益高手
  10. 20200705:力扣196周周赛上
  11. atlas 力矩计算_Atlas 2.1.0 实践(2)—— 安装Atlas
  12. 【源码】高精度31波段音频均衡器
  13. Map集合常见面试题
  14. chrome安装油猴插件
  15. 后端返回图片二进制流,前端处理
  16. javascript 幻灯片代码(含自动播放)
  17. php 全等 性能,在PHP中,相等(==)和全等(===)的含义是一样的。
  18. 解决缺少 SHA256.h文件
  19. 阿里云云服务器无法通过公网ip地址访问网站的解决方法
  20. 【实验五 一维数组】7-9 sdut-C语言实验- 排序

热门文章

  1. 微信小程序开发教程,大多数人都搞错的八个问题
  2. NASM汇编初探(入门教程)
  3. 【uniapp】 H5微信扫码登录
  4. Adversarial Example Detection Using Latent Neighborhood Graph
  5. hadoop2x-eclipse-plugin的下载地址
  6. conda更换清华源
  7. 代码重构技巧之重复代码
  8. centos arm架构镜像地址
  9. PVDF电荷放大器的设计实践( 2 )
  10. 孙溟㠭先生禅意篆刻《虚空粉碎》