热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

912.SortanArray排序复习快速排序,选择排序,插入排序,归并排序,堆排序

目录快速排序选择排序插入排序归并排序堆排序总结Givenanarrayofintegersnums,sortthearrayinascendingorder.Exam

目录

快速排序

选择排序 

插入排序

归并排序

堆排序

总结


Given an array of integers nums, sort the array in ascending order.

Example 1:

Input: nums = [5,2,3,1]
Output: [1,2,3,5]

Example 2:

Input: nums = [5,1,1,2,0,0]
Output: [0,0,1,1,2,5]

Constraints:

  • 1 <&#61; nums.length <&#61; 50000
  • -50000 <&#61; nums[i] <&#61; 50000

题目链接&#xff1a; Loading...

快速排序

class Solution {
public:void quicksort(vector&nums,int left,int right){if(left>&#61;right)//此处应该是大于等于&#xff0c;等于的时候就可以停止了{return ;}int i&#61;left,j&#61;right,key&#61;nums[left];while(i&#61;key){//选出来的nums[j] 小于 keyj--;}nums[i]&#61;nums[j];while(i sortArray(vector& nums) {quicksort(nums,0,nums.size()-1);return nums;}
};

快速排序是不稳定的&#xff0c;为什么呢&#xff1f;

经过第一次sort后&#xff0c;对于j&#xff0c;j&#61;5就停止了&#xff0c;对于i&#xff0c;i一直&#43;&#43;到5。

这样赋值后&#xff0c;红色的9跑到黑色的9后面了。 

有的例子就刚好不会变&#xff0c;下面这种就不会变化。

选择排序 

是想复习一下&#xff0c;但是选择排序复杂度比较高&#xff0c;过不了。这些排序的复杂度表

  

堆排序

堆排序&#xff08;这篇博客说的挺好的排序六 堆排序&#xff09;是使用大根堆&#xff08;父节点不小于子节点&#xff09;&#xff0c;为啥从下往上调整呢&#xff0c;看个例子

把3和1调完之后&#xff0c; 根节点还要调整&#xff08;因为4是最大的&#xff0c;4还要和根节点调整&#xff0c;导致根节点的值换了2次&#xff0c;从下往上调整&#xff0c;根节点只需要调整一次就行了&#xff0c;这样从下往上调整&#xff0c;所有非叶子节点调整一次&#xff0c;绝对就是对的了&#xff0c;不用考虑有的节点是不是还要调整一次&#xff09;&#xff0c;一个节点就可能重复调整&#xff0c;不止一次。从下往上调整&#xff0c;省去了父节点二次调整&#xff0c;简单省事了&#xff0c;不用考虑二次调整了。

这个例子第一次的调整构造初始堆过程如下图&#xff1a;

上面这个例子层数有点少&#xff0c;2种遍历都是调整3次&#xff0c;但是对于一个节点&#xff0c;既是父节点又是子节点&#xff0c;它的子节点还有子节点 &#xff0c;步骤就上来了&#xff0c;比如下图的数字4

void heapAdjust(vector & arr, int parent,int N){int largest &#61; parent;int child&#61;2*parent&#43;1;while(childarr[largest]){largest&#61;child;}if(child&#43;1arr[largest]){largest&#61;child&#43;1;child&#43;&#43;;//更新child的值}swap(arr[parent],arr[largest]);//交换parent&#61;largest;// parent&#61;child;在没有child大于parent的时候&#xff0c;largest还是parent&#xff0c;child是2*parent&#43;1,所以不能这么写child&#61;2*child&#43;1;//child根据child值翻倍&#xff0c;这样如果么有需要更新的&#xff0c;parent一直不变&#xff0c;child一直增大会退出}}void heapSort(vector& nums){for(int i &#61; nums.size()/2; i >&#61; 0; i--){//从最后一个非叶子节点开始调整heapAdjust(nums,i,nums.size());}for(int i &#61; nums.size()-1; i >&#61; 0; i--){swap(nums[0] , nums[i]);//下标0存放的是调整后最大值&#xff0c;交换后放到下标 i(当前未排序的最后位置)heapAdjust(nums,0,i);//i表示调整的元素个数&#xff0c;i从 size()-1 开始}}

堆排序是不稳定的&#xff0c;看个图&#xff0c;原先的数组顺序是 1 2 2,调整之后 1 2 2&#xff0c;黄框是排序一次后的堆结构。

 


总结

对于这道题&#xff0c;我把所有排序方法都汇总在一起了

class Solution {
public:
void quickSort(vector&nums,int left,int right){if(left>right){return ;}int i&#61;left,j&#61;right,key&#61;nums[left];while(i&#61;key){//选出来的nums[j] 小于 keyj--;}nums[i]&#61;nums[j];while(i&nums){int len&#61;nums.size();int index&#61;0;for(int i&#61;0;i& nums){int len&#61;nums.size(),tmp&#61;0,i&#61;0,j&#61;0;for(i&#61;1;i&#61;0&&tmp& nums,int start,int mid,int last){vector tmp(last-start&#43;1,0);// vector tmp(nums.size(),0);这一点真的很棒&#xff0c;考虑数组元素多的时候&#xff0c;这样初始化很浪费时间&#xff0c;会超时&#xff0c;这点leetcode给我上了一课。int i&#61;start,j&#61;mid&#43;1,k&#61;0;//k记录start位置&#xff0c;tmp从哪个下标开始while(i<&#61;mid&&j<&#61;last){if(nums[i]& nums,int start,int last){if(start & arr, int parent,int N){int largest &#61; parent;int child&#61;2*parent&#43;1;while(childarr[largest]){largest&#61;child;}if(child&#43;1arr[largest]){largest&#61;child&#43;1;child&#43;&#43;;//更新child的值}swap(arr[parent],arr[largest]);//交换parent&#61;largest;// parent&#61;child;在没有child大于parent的时候&#xff0c;largest还是parent&#xff0c;child是2*parent&#43;1,所以不能这么写child&#61;2*child&#43;1;}// int left &#61; 2*parent&#43;1;// int right &#61; 2*parent&#43;2;// if(left arr[largest])// largest &#61; left;// if(right arr[largest])// largest &#61; right;// if(largest !&#61; parent){// swap(arr[parent], arr[largest]);// heapAdjust(arr,largest,N);// }}void heapSort(vector& nums){for(int i &#61; nums.size()/2; i >&#61; 0; i--){//从最后一个非叶子节点开始调整heapAdjust(nums,i,nums.size());}for(auto it:nums){cout<&#61; 0; i--){swap(nums[0] , nums[i]);//下标0存放的是调整后最大值&#xff0c;交换后放到下标 i(当前未排序的最后位置)heapAdjust(nums,0,i);//i表示调整的元素个数&#xff0c;i从 size()-1 开始}}vector sortArray(vector& nums) {// quickSort(nums,0,nums.size()-1);// selectSort(nums);// insertSort(nums);// mergeSort(nums,0,nums.size()-1);heapSort(nums);return nums;}};

复杂度汇总 

 


推荐阅读
  • Parity game(poj1733)题解及思路分析
    本文是对题目"Parity game(poj1733)"的解题思路进行分析。题目要求判断每次给出的区间内1的个数是否和之前的询问相冲突,如果冲突则结束。本文首先介绍了离线算法的思路,然后详细解释了带权并查集的基本操作。同时,本文还对异或运算进行了学习,并给出了具体的操作步骤。最后,本文给出了完整的代码实现,并进行了测试。 ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 开发笔记:快速排序和堆排序
    本文由编程笔记#小编为大家整理,主要介绍了快速排序和堆排序相关的知识,希望对你有一定的参考价值。快速排序思想:在partition中,首先以最右边的值作为划分值x,分别维护小于 ... [详细]
  • 数据结构与算法习题replacementselectionsort(置换选择排序)TimeLimit:1000msMemoryLimit:65536kBDescrip ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • Apple iPad:过渡设备还是平板电脑?
    I’vebeenagonizingoverwhethertopostaniPadarticle.Applecertainlydon’tneedmorepublicityandthe ... [详细]
  • PriorityQueue源码分析
     publicbooleanhasNext(){returncursor&amp;amp;lt;size||(forgetMeNot!null&amp;amp;am ... [详细]
  • 尾部|柜台_Java并发线程池篇附场景分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java并发-线程池篇-附场景分析相关的知识,希望对你有一定的参考价值。作者:汤圆个人博客 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有