力扣 912. 排序数组
文章目录
- 一、题目描述
- 二、题解
- 1.快速排序
- 2.堆排序
- 3.二路归并排序
一、题目描述
示例 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. 排序数组相关推荐
- 力扣——在排序数组中查找元素的第一个和最后一个位置
在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 如果数组中不存在目标值 target,返 ...
- 力扣删除排序数组中的重复项 II
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的 ...
- 力扣删除排序数组中的重复项
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条 ...
- 力扣34-在排序数组中查找元素的第一个和最后一个位置(Java,二分,附思路)
思路: 用顺序查找很简单,但是logn解法就是用二分查找了,数组又是排好序的. nums[mid]和target不一样的情况与普通的二分查找并无二致,要找target出现的前后位置,那肯定就只是在相等 ...
- LeetCode 912. 排序数组(Java)
912. 排序数组 你一个整数数组 nums,请你将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出:[1,2,3,5] 提示: 1 <= nums.length &l ...
- 力扣 两个数组的交集
力扣 两个数组的交集 题目描述 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 示例 2: 输入:num ...
- 力扣练习题(数组中数据反转)
力扣练习题(数组中数据反转) 要求:int[] arr = {12,23,34,45,56,67,78,89,90}; 变为:int[] arr = {90,89,78,67,56,45,34,23, ...
- Leetcode 912.排序数组(Sort an Array)
Leetcode 912.排序数组 1 题目描述(Leetcode题目链接) 给定一个整数数组 nums,将该数组升序排列. 输入:[5,2,3,1] 输出:[1,2,3,5] 输入:[5,1,1 ...
- LeetCode 912. 排序数组【模板题】
912. 排序数组 [快排] class Solution {// 快速排序 7:32 13void quickSort(int[] nums, int l, int r){if(l >= r) ...
最新文章
- python下载完以后是什么样子_python下载后怎么用
- 虚拟机克隆,并设置新的ip,配置hostname,配合hostname,hosts
- Django基础核心技术之Model模型的介绍与设计
- jquery去掉数组最后一个元素_从数组中删除最后一项
- 共轨之家获吉利家族基金新一轮融资 5个月前曾获磐霖资本领投A轮融资
- python之虚拟环境
- Linux查询root环境变量,linux环境变量和查看方法
- 手动安装Linux网卡驱动程序
- 精益画布_这6本书让你成为精益高手
- 20200705:力扣196周周赛上
- atlas 力矩计算_Atlas 2.1.0 实践(2)—— 安装Atlas
- 【源码】高精度31波段音频均衡器
- Map集合常见面试题
- chrome安装油猴插件
- 后端返回图片二进制流,前端处理
- javascript 幻灯片代码(含自动播放)
- php 全等 性能,在PHP中,相等(==)和全等(===)的含义是一样的。
- 解决缺少 SHA256.h文件
- 阿里云云服务器无法通过公网ip地址访问网站的解决方法
- 【实验五 一维数组】7-9 sdut-C语言实验- 排序