1.堆排序

要求:对于大顶堆,孩子节点的值小于父节点。

说明:数据会存储在数组中,从数组下标1开始存储根节点,假如i为父节点,则2*i是左孩子,2*i+1是右孩子。

方法:向上调整

步骤:

第一步:建堆,从有孩子节点p开始调整,将p的两个孩子节点较大者与父节点(p)交换,再调整交换过的以子节点为根的树,直到以p为根节点的树满足要求。

第二步:调整堆,因为根节点是最大的,保存后;将最后一个节点与根节点交换,调整树,直到满足要求。调用建堆的方法即可。

  1. #include "iostream"
  2. #include "vector"
  3. using namespace std;
  4. //大顶堆的构造,传入的p是父节点,使得以p为根节点的树,满足大顶堆
  5. void HeapAdjust(vector<int> &vec,int p,int n){
  6. int temp=vec[p];
  7. for (int i = * p; i <= n;i*=) {
  8. if (i < n&&vec[i] < vec[i + ])
  9. i++;//找到两个孩子结点中最大的
  10. if (temp >= vec[i])
  11. break;//根节点大于子节点,则退出
  12. vec[p] = vec[i]; //将孩子节点放到父节点上
  13. p = i;
  14. }
  15. vec[p] = temp;//将开始的p节点放到最终位置
  16. }
  17.  
  18. //大顶堆排序,调整堆
  19. void HeapSort(vector<int> &vec){
  20. int n=vec.size()-;
  21. //首先将无序数列转换为大顶堆
  22. for (int i = n / ; i > ;i--) //注意由于是完全二叉树,所以我们从一半向前构造,传入父节点
  23. HeapAdjust(vec, i, n);
  24.  
  25. //将最大的元素放入目标位置,然后将剩余元素重新构造大顶堆
  26. for (int i = n; i >;i--){
  27. swap(vec[], vec[i]);
  28. HeapAdjust(vec, , i - );
  29. }
  30. }
  31. int main(){
  32. //注意数组中第一个值是不参与排序的,无意义的
  33. vector<int> vec={,,,,,,,,,};
  34. HeapSort(vec);
  35. //1 2 3 4 5 23 45 55 345
  36. for (auto item:vec)cout<<item<<" ";
  37. return ;
  38. }

2.快排

快排有两个步骤:

第一步:选取数组的第一个数值为枢轴值,而后将数组调整为左边小于枢轴值,右边大于枢轴值。

第二步:分别对枢轴值左边和右边部分执行上述操作。

具体示例如下:

假如有如下数组

一趟排序之后

而后分别对枢轴值左边部分和右边部分做同样的操作,最终得到有序数组。

对应的程序代码如下:

  1. #include "iostream"
  2. #include "vector"
  3. using namespace std;
  4. //一趟排序的第一种写法
  5. int ajust_one(vector<int> &vec,int left,int right){
  6. int pivot=vec[left];
  7. //跳出循环是left=right
  8. while (left<right){
  9. //如下顺序不可调换
  10. while (left<right&&vec[right]>=pivot)right--;
  11. vec[left]=vec[right];
  12. while (left<right&&vec[left]<=pivot)left++;
  13. vec[right]=vec[left];
  14.  
  15. }
  16. //将枢轴值放到归位
  17. vec[left]=pivot;
  18. return left;
  19. }
  20. //一趟排序的第二种写法
  21. int ajust_two(vector<int> &vec,int left,int right){
  22. int left_start=left;
  23. int pivot=vec[left];
  24. //跳出循环是left=right
  25. while (left<right){
  26. //如下顺序不可调换
  27. while (left<right&&vec[right]>=pivot)right--;
  28. while (left<right&&vec[left]<=pivot)left++;
  29. swap(vec[left],vec[right]);//交换两个值
  30. }
  31. //将枢轴值放到归位
  32. vec[left_start]=vec[left];
  33. vec[left]=pivot;
  34. return left;
  35. }
  36. void quickSort(vector<int> &vec,int left,int right){
  37. if(left<right){
  38. int mid=ajust_one(vec,left,right);
  39. quickSort(vec,left,mid-);
  40. quickSort(vec,mid+,right);
  41. }
  42. }
  43. int main(){
  44. vector<int> vec={,,,,,,,,};
  45. quickSort(vec,,vec.size()-);
  46. //1 2 3 4 5 23 45 55 345
  47. for (auto item:vec)cout<<item<<" ";
  48. return ;
  49. }

3.归并排序

经典的分治策略,先分成小问题,而后再合并,最后问题得到求解。

  1. #include "iostream"
  2. #include "vector"
  3. using namespace std;
  4. void ajust(vector<int> &vec,int left,int mid,int right){
  5. vector<int> temp(right-left+,);
  6. int left_start=left;//保存开始位置
  7. int mid_right=mid+;//
  8. int i=;
  9. while (left<=mid&&mid_right<=right){
  10. if(vec[left]<vec[mid_right])
  11. temp[i++]=vec[left++];
  12. else
  13. temp[i++]=vec[mid_right++];
  14. }
  15. //将未完成的部分,补到数组后面
  16. while(left<=mid)temp[i++]=vec[left++];
  17. while(mid_right<=right) temp[i++]=vec[mid_right++];
  18. //将临时数组的值拷贝到原数组中
  19. i=;
  20. while(left_start<=right)vec[left_start++]=temp[i++];
  21. }
  22. void merge(vector<int> &vec,int left,int right){
  23. if(left<right){
  24. int mid=(left+right)/;
  25. merge(vec,left,mid);//left到mid是有序,包括边界
  26. merge(vec,mid+,right);//mid+1到right有序,包括边界
  27. ajust(vec,left,mid,right);
  28. }
  29. }
  30. int main(){
  31. vector<int> vec={,,,,,,,,};
  32. merge(vec,,vec.size()-);
  33. //1 2 3 4 5 23 45 55 345
  34. for (auto item:vec)cout<<item<<" ";
  35. return ;
  36. }

堆排序图解可参考:https://www.cnblogs.com/chengxiao/p/6129630.html

归并排序详解可参考:https://www.cnblogs.com/chengxiao/p/6194356.html

leetcode 排序问题的更多相关文章

  1. 【LeetCode】Partition List ——链表排序问题

    [题目] Given a linked list and a value x, partition it such that all nodes less than x come before nod ...

  2. [LeetCode] Reorder List 链表重排序

    Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do th ...

  3. LeetCode编程训练 - 拓扑排序(Topological Sort)

    拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...

  4. [LeetCode] 面试题之犄角旮旯 第叁章

    题库:LeetCode题库 - 中等难度 习题:网友收集 - zhizhiyu 此处应为一个简单的核心总结,以及练习笔记. 查找一个数“在不在”?桶排序理论上貌似不错. 回文问题 ----> [ ...

  5. LeetCode刷题总结-栈、链表、堆和队列篇

    本文介绍LeetCode上有关栈.链表.堆和队列相关的算法题的考点,推荐刷题20道.具体考点分类如下图: 一.栈 1.数学问题 题号:85. 最大矩形,难度困难 题号:224. 基本计算器,难度困难 ...

  6. leetcode 学习心得 (2) (301~516)

    源代码地址:https://github.com/hopebo/hopelee 语言:C++ 301. Remove Invalid Parentheses Remove the minimum nu ...

  7. LeetCode 164. Maximum Gap[翻译]

    164. Maximum Gap 164. 最大间隔 Given an unsorted array, find the maximum difference between the successi ...

  8. LeetCode刷题总结-动态规划篇

    本文总结LeetCode上有动态规划的算法题,推荐刷题总数为54道.具体考点分析如下图: 1.中心扩展法 题号:132. 分割回文串 II,难度困难 2.背包问题 题号:140. 单词拆分 II,难度 ...

  9. 【LeetCode】791. Custom Sort String 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 按顺序构造字符串 排序 日期 题目地址:https: ...

随机推荐

  1. 手工挖掘web常见漏洞时的一些经验总结

    一.前提: 漏洞挖掘原则 所有变量 所有头 cookie中的变量 逐个变量删除 漏洞的本质 数据与指令的混淆 对用户输入信息过滤不严判断失误,误将数据当指令 二.经典漏洞: 1.身份认证 常用弱口令/ ...

  2. echarts常用说明

    import { Injectable } from '@angular/core'; //模板option通用 let fff7 = '#fff'; //字体统一颜色rgba(255,255,255 ...

  3. Codeforces Round #597 (Div. 2) E. Hyakugoku and Ladders 概率dp

    E. Hyakugoku and Ladders Hyakugoku has just retired from being the resident deity of the South Black ...

  4. 开发常用Git/Linux/idea命令快捷键总结(持续更新)

    在开发过程中,会使用越来越多的命令,或快捷键,来帮助我们提高工作效率.本文记录了我在平时积累的常用命令,分享给大家. git命令 基本命令 set LESSCHARSET=utf-8 --idea T ...

  5. 【linux】linux命令--uptime查看机器存活多久和平均负载 解读平均负载含义

    一.uptime命令,查看机器存活时间和平均负载 键入命令: uptime 该结果和 top命令查看结果最上面一行的 是一样的显示. 返回数据介绍: #当前服务器时间: 19:56:44 #当前服务器 ...

  6. 解决真机编译出现System.DllNotFoundException: 'libmono-native.so'错误都方法

    1.去掉勾选:使用共享运行时 2 检查android SDK是否安装了NDK 3.使用真机运行编译APK

  7. 深入理解AbstractQueuedSynchronizer(AQS)

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  8. 1G内存VPS安装 mysql5.6 经常挂

    背景介绍 去年3月份的时候参加了腾讯云主机活动,5年362,非常优惠.当时的想法是买来可以瞎整一波,虽然配置不高,但是搞点事情也够用. 配置如下,上海机房 1 核 1 GB 1 Mbps 系统盘:普通 ...

  9. JVM 参数配置

    JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xmn512m -Xss256k -XX:PermSize=256m -XX:MaxPermSize=256m ...

  10. .NET MVC5简介(一)

    就像是.NET Framework WebApi与.NET Core WebApi一样,.NET Framework MVC与.NET Core MVC的区别,也是框架的之间的区别.本系列先首先从.N ...