1.堆排序

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

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

方法:向上调整

步骤:

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

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

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

2.快排

快排有两个步骤:

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

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

具体示例如下:

假如有如下数组

一趟排序之后

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

对应的程序代码如下:

#include "iostream"
#include "vector"
using namespace std;
//一趟排序的第一种写法
int ajust_one(vector<int> &vec,int left,int right){
int pivot=vec[left];
//跳出循环是left=right
while (left<right){
//如下顺序不可调换
while (left<right&&vec[right]>=pivot)right--;
vec[left]=vec[right];
while (left<right&&vec[left]<=pivot)left++;
vec[right]=vec[left]; }
//将枢轴值放到归位
vec[left]=pivot;
return left;
}
//一趟排序的第二种写法
int ajust_two(vector<int> &vec,int left,int right){
int left_start=left;
int pivot=vec[left];
//跳出循环是left=right
while (left<right){
//如下顺序不可调换
while (left<right&&vec[right]>=pivot)right--;
while (left<right&&vec[left]<=pivot)left++;
swap(vec[left],vec[right]);//交换两个值
}
//将枢轴值放到归位
vec[left_start]=vec[left];
vec[left]=pivot;
return left;
}
void quickSort(vector<int> &vec,int left,int right){
if(left<right){
int mid=ajust_one(vec,left,right);
quickSort(vec,left,mid-);
quickSort(vec,mid+,right);
}
}
int main(){
vector<int> vec={,,,,,,,,};
quickSort(vec,,vec.size()-);
//1 2 3 4 5 23 45 55 345
for (auto item:vec)cout<<item<<" ";
return ;
}

3.归并排序

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

#include "iostream"
#include "vector"
using namespace std;
void ajust(vector<int> &vec,int left,int mid,int right){
vector<int> temp(right-left+,);
int left_start=left;//保存开始位置
int mid_right=mid+;//
int i=;
while (left<=mid&&mid_right<=right){
if(vec[left]<vec[mid_right])
temp[i++]=vec[left++];
else
temp[i++]=vec[mid_right++];
}
//将未完成的部分,补到数组后面
while(left<=mid)temp[i++]=vec[left++];
while(mid_right<=right) temp[i++]=vec[mid_right++];
//将临时数组的值拷贝到原数组中
i=;
while(left_start<=right)vec[left_start++]=temp[i++];
}
void merge(vector<int> &vec,int left,int right){
if(left<right){
int mid=(left+right)/;
merge(vec,left,mid);//left到mid是有序,包括边界
merge(vec,mid+,right);//mid+1到right有序,包括边界
ajust(vec,left,mid,right);
}
}
int main(){
vector<int> vec={,,,,,,,,};
merge(vec,,vec.size()-);
//1 2 3 4 5 23 45 55 345
for (auto item:vec)cout<<item<<" ";
return ;
}

堆排序图解可参考: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. RF自动化测试之元素封装

    自动化测试均需要遵循由点到面的规则,然而对于UI自动化,点是最容易发生变化的,如果使用硬链接,那么每次元素的修改都必须修改代码,这对于代码功底薄弱的测试工程师来说,是较为困难的,所以自动化测试需要对底 ...

  2. R1-5天

    R语言笔记文档 2019.11.24 R语言的安装 工作目录查看与更改 变量的三种赋值 如何查看R语言帮助 ? args 基础数据类型 基本数据类型 因子.数据框.数组.矩阵.列表.向量 2019.1 ...

  3. Cent OS6.5——网络配置

    1.已安装centos 系统,打开虚拟机,并开机进入centos系统 2.进行网络配置,必须先确认以下几个点: 2-1.网络适配器模式是否为NAT模式,点击虚拟机,选择设置 ——选择网络适配器,NAT ...

  4. HashMap默认加载因子为什么选择0.75?(阿里)

    Hashtable 初始容量是11 ,扩容 方式为2N+1; HashMap 初始容量是16,扩容方式为2N; 阿里的人突然问我为啥扩容因子是0.75,回来总结了一下: 提高空间利用率和 减少查询成本 ...

  5. acwing 70-72 剑指OFFER 二叉树相关

    地址 https://www.acwing.com/problem/content/66/ https://www.acwing.com/problem/content/67/ https://www ...

  6. 2019-2020-1 20199305《Linux内核原理与分析》第二周作业

    C程序的反汇编 (一)实验截图 复制所需要的C程序到"剪切板" 在虚拟机环境下粘贴过来 接下来进行反汇编,通过输入gcc -S -o main.s main.c -m32得到32位 ...

  7. Noip2016Day2T3 愤怒的小鸟

    题目链接 problem 平面内有n个点,每次可以确定一条过原点且开口向上的抛物线,将这条抛物线上所有的点都删去.问最少需要删几次可以删掉全部的点. solution n比较小,直接状压一下.因为已经 ...

  8. IT兄弟连 HTML5教程 HTML5的曲折发展过程 HTML5的诞生

    十年磨一剑,正如我们所看到的一样,HTML5大潮正来势汹汹.但也正如我们所知道的一样,HTML5是一种技术标准,它的语义之美.人性之美.简单之美.实用之美……如同一场革命,它的主要应用场景是浏览器,不 ...

  9. IT兄弟连 HTML5教程 HTML5的靠山 W3C、IETF是什么

    无规矩不成方圆,软件开发当然不能例外.Web开发涉及的厂商和技术非常多,所以必须要有参考的标准,而且需要一系列的标准.Web程序都是通过浏览器来解析执行的,通过页面的展示内容与用户互动,所以Web标准 ...

  10. 拎壶学python3-----(2)python之if语句用法

    在生活中我们经常遇到各种选择,比如玩色子,猜大小,再比如选择未来另一半.python也经常会遇到这样的选择,这时候if语句显得尤为重要. 下边我们看一个简单的例子 如果是二选一怎么做呢?如下 如果多个 ...