排序:快排(随机选择枢轴)、堆排序、归并排序
以力扣912题为例:
快速排序代码如下:
时间复杂度:基于随机选取主元的快速排序时间复杂度为期望 O(nlogn),其中 n 为数组的长度。详细证明过程可以见《算法导论》第七章,这里不再大篇幅赘述。
空间复杂度:O(h),其中 h 为快速排序递归调用的层数。我们需要额外的 O(h) 的递归调用的栈空间,由于划分的结果不同导致了快速排序递归调用的层数也会不同,最坏情况下需 O(n) 的空间,最优情况下每次都平衡,此时整个递归树高度为 \log nlogn,空间复杂度为 O(logn)。
class Solution {int partition(vector<int>& nums, int l, int r) {int pivot = nums[r];int i = l - 1;for (int j = l; j <= r - 1; ++j) {if (nums[j] <= pivot) {i = i + 1;swap(nums[i], nums[j]);}}swap(nums[i + 1], nums[r]);return i + 1;}int randomized_partition(vector<int>& nums, int l, int r) {int i = rand() % (r - l + 1) + l; // 随机选一个作为我们的主元swap(nums[r], nums[i]);return partition(nums, l, r);}void randomized_quicksort(vector<int>& nums, int l, int r) {if (l < r) {int pos = randomized_partition(nums, l, r);randomized_quicksort(nums, l, pos - 1);randomized_quicksort(nums, pos + 1, r);}}
public:vector<int> sortArray(vector<int>& nums) {srand((unsigned)time(NULL));randomized_quicksort(nums, 0, (int)nums.size() - 1);return nums;}
};
堆排序代码如下:
时间复杂度:O(nlogn)。初始化建堆的时间复杂度为 O(n),建完堆以后需要进行 n−1 次调整,一次调整(即 maxHeapify) 的时间复杂度为 O(logn),那么 n−1 次调整即需要 O(nlogn) 的时间复杂度。因此,总时间复杂度为 O(n+nlogn)=O(nlogn)。
空间复杂度:O(1)。只需要常数的空间存放若干变量。
class Solution {void maxHeapify(vector<int>& nums, int i, int len) {for (; (i << 1) + 1 <= len;) {int lson = (i << 1) + 1;int rson = (i << 1) + 2;int large;if (lson <= len && nums[lson] > nums[i]) {large = lson;} else {large = i;}if (rson <= len && nums[rson] > nums[large]) {large = rson;}if (large != i) {swap(nums[i], nums[large]);i = large;} else {break;}}}void buildMaxHeap(vector<int>& nums, int len) {for (int i = len / 2; i >= 0; --i) {maxHeapify(nums, i, len);}}void heapSort(vector<int>& nums) {int len = (int)nums.size() - 1;buildMaxHeap(nums, len);for (int i = len; i >= 1; --i) {swap(nums[i], nums[0]);len -= 1;maxHeapify(nums, 0, len);}}
public:vector<int> sortArray(vector<int>& nums) {heapSort(nums);return nums;}
};
归并排序代码如下:
时间复杂度:O(nlogn)。
空间复杂度:O(n)。
class Solution {vector<int> tmp;void mergeSort(vector<int>& nums, int l, int r) {if (l >= r) return;int mid = (l + r) >> 1;mergeSort(nums, l, mid);mergeSort(nums, mid + 1, r);int i = l, j = mid + 1;int cnt = 0;while (i <= mid && j <= r) {if (nums[i] <= nums[j]) {tmp[cnt++] = nums[i++];}else {tmp[cnt++] = nums[j++];}}while (i <= mid) {tmp[cnt++] = nums[i++];}while (j <= r) {tmp[cnt++] = nums[j++];}for (int i = 0; i < r - l + 1; ++i) {nums[i + l] = tmp[i];}}
public:vector<int> sortArray(vector<int>& nums) {tmp.resize((int)nums.size(), 0);mergeSort(nums, 0, (int)nums.size() - 1);return nums;}
};
排序:快排(随机选择枢轴)、堆排序、归并排序相关推荐
- 单链表排序----快排 归并排序
单链表排序----快排 & 归并排序 原文:http://blog.csdn.net/u012658346/article/details/51141288 题目描述: 给定一个乱序的单链表 ...
- 快排、归并、堆排序运用场景
快排,归并排,堆排序时间复杂度相同,但它们三者区别是快速排序和堆排序是不稳定的,归并为稳定型,对于辅助空间堆排序要求最小,归并最多,它们排序的最好情况复杂度相同,最坏的情况下快速排序要复杂些,根据数据 ...
- 排序 ---- 快排(C语言)
思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都要比另一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快排,整个过程可以递归进行,以此达到整个数据变成有序序列. 时 ...
- 快排堆排归排三种排序的比较
目录 快排 堆排序 归并排序 三种排序的比较 快排 快速排序中最简单的(递归调用) 注:倒序,和 列表中有大量重复元素时,时间复杂度很大 快排例子 注:快排代码实现(类似于二叉树 递归调用) 时间复杂 ...
- C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划
C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...
- 【数据结构的魅力】003.算法归并与随机快排
归并排序的实现 1)递归方法实现 2)非递归方法实现 快速排序 Partition过程 实现思路: 给定一个num,划定一个<=区,初始坐标为-1 如果[i]==num,i++ 如果[i]< ...
- c语言程序快排,C语言快排
C语言使用快排的方式有两种,1.直接用库函数stdlib.h里的qsort函数 2.自己编写快排代码(第一种方便,第二种较为自由) qsort 的函数原型是: void qsort(void*base ...
- 三种快排及四种优化方式
本文是转载文章,文章的来源:csdn博客 博主:silentsharer 文章: 三种快排及四种优化方式 博文地址:https://blog.csdn.net/hacker00011000/artic ...
- 快排的优化策略(3种快排4种优化)
转自:http://blog.csdn.net/hacker00011000/article/details/52176100 1.快速排序的基本思想: 快速排序使用分治的思想,通过一趟排序将待排序列 ...
最新文章
- IntelliJ IDEA 2020.2 发布:支持Java 15、GitHub审查、运行时异常的排查辅助...
- elasticSearch6源码分析(4)indices模块
- 将文件从HDFS复制到本地
- LeetCode 189. 旋转数组(环形替换)
- PAT乙级(1016 部分A+B)
- JAVA中的线程安全与非线程安全,java面试题,java高级笔试题
- 语言防止鼠标连点_全球化设计系列 | 多语言设计的“小锦囊”
- VB取得TextBox、RichTextBox光标所在的行和列(支持汉字)
- linux max open,linux下修改max_user_processes和open_file的最大值
- 【优化算法】白头鹰搜索优化算法(BES)【含Matlab源码 1381期】
- 面试宝典之深度学习面试题(下)
- 儿童计算机编程课程,少儿编程基础课程介绍
- 论结果与过程的重要性
- Ubuntu 14.04安装配置Calamari
- 做自媒体,不用露脸拍视频,方法都在这篇文章
- Java抽象类(abstract)
- 并发编程——线程协作
- FAT文件系统原理(一)
- DirectX的设置
- 达人评测 酷睿i9 12950hx和i9 12900hx区别哪个强
热门文章
- webRTC(十三):webrtc 统计信息
- dns配置异常怎么修复_DNS配置错误,电脑管家又修复不了,怎么办。
- java文本复制和键盘输入文字保存到文件
- 万网m3 windows linux切换,万网M3-linux虚拟主机开启网页Gzip压缩方法
- 【学习打卡05】可解释机器学习笔记之CAM+Captum代码实战
- pymol配体平移与旋转
- 古文摘抄(持续不定时更新)
- SQL Sever2012安装错误——Windows Installer错误消息:打开安装日志文件的错误的原因及解决方案
- 9个免费开源的bug追踪软件
- 程序算法之逆推法(口算猴子摘桃问题正解、详解)