以力扣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;}
};

排序:快排(随机选择枢轴)、堆排序、归并排序相关推荐

  1. 单链表排序----快排 归并排序

    单链表排序----快排 & 归并排序 原文:http://blog.csdn.net/u012658346/article/details/51141288 题目描述:  给定一个乱序的单链表 ...

  2. 快排、归并、堆排序运用场景

    快排,归并排,堆排序时间复杂度相同,但它们三者区别是快速排序和堆排序是不稳定的,归并为稳定型,对于辅助空间堆排序要求最小,归并最多,它们排序的最好情况复杂度相同,最坏的情况下快速排序要复杂些,根据数据 ...

  3. 排序 ---- 快排(C语言)

    思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都要比另一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快排,整个过程可以递归进行,以此达到整个数据变成有序序列. 时 ...

  4. 快排堆排归排三种排序的比较

    目录 快排 堆排序 归并排序 三种排序的比较 快排 快速排序中最简单的(递归调用) 注:倒序,和 列表中有大量重复元素时,时间复杂度很大 快排例子 注:快排代码实现(类似于二叉树 递归调用) 时间复杂 ...

  5. C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划

    C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...

  6. 【数据结构的魅力】003.算法归并与随机快排

    归并排序的实现 1)递归方法实现 2)非递归方法实现 快速排序 Partition过程 实现思路: 给定一个num,划定一个<=区,初始坐标为-1 如果[i]==num,i++ 如果[i]< ...

  7. c语言程序快排,C语言快排

    C语言使用快排的方式有两种,1.直接用库函数stdlib.h里的qsort函数 2.自己编写快排代码(第一种方便,第二种较为自由) qsort 的函数原型是: void qsort(void*base ...

  8. 三种快排及四种优化方式

    本文是转载文章,文章的来源:csdn博客 博主:silentsharer 文章: 三种快排及四种优化方式 博文地址:https://blog.csdn.net/hacker00011000/artic ...

  9. 快排的优化策略(3种快排4种优化)

    转自:http://blog.csdn.net/hacker00011000/article/details/52176100 1.快速排序的基本思想: 快速排序使用分治的思想,通过一趟排序将待排序列 ...

最新文章

  1. IntelliJ IDEA 2020.2 发布:支持Java 15、GitHub审查、运行时异常的排查辅助...
  2. elasticSearch6源码分析(4)indices模块
  3. 将文件从HDFS复制到本地
  4. LeetCode 189. 旋转数组(环形替换)
  5. PAT乙级(1016 部分A+B)
  6. JAVA中的线程安全与非线程安全,java面试题,java高级笔试题
  7. 语言防止鼠标连点_全球化设计系列 | 多语言设计的“小锦囊”
  8. VB取得TextBox、RichTextBox光标所在的行和列(支持汉字)
  9. linux max open,linux下修改max_user_processes和open_file的最大值
  10. 【优化算法】白头鹰搜索优化算法(BES)【含Matlab源码 1381期】
  11. 面试宝典之深度学习面试题(下)
  12. 儿童计算机编程课程,少儿编程基础课程介绍
  13. 论结果与过程的重要性
  14. Ubuntu 14.04安装配置Calamari
  15. 做自媒体,不用露脸拍视频,方法都在这篇文章
  16. Java抽象类(abstract)
  17. 并发编程——线程协作
  18. FAT文件系统原理(一)
  19. DirectX的设置
  20. 达人评测 酷睿i9 12950hx和i9 12900hx区别哪个强

热门文章

  1. webRTC(十三):webrtc 统计信息
  2. dns配置异常怎么修复_DNS配置错误,电脑管家又修复不了,怎么办。
  3. java文本复制和键盘输入文字保存到文件
  4. 万网m3 windows linux切换,万网M3-linux虚拟主机开启网页Gzip压缩方法
  5. 【学习打卡05】可解释机器学习笔记之CAM+Captum代码实战
  6. pymol配体平移与旋转
  7. 古文摘抄(持续不定时更新)
  8. SQL Sever2012安装错误——Windows Installer错误消息:打开安装日志文件的错误的原因及解决方案
  9. 9个免费开源的bug追踪软件
  10. 程序算法之逆推法(口算猴子摘桃问题正解、详解)