【排序算法】归并排序与快速排序

这篇具有很好参考价值的文章主要介绍了【排序算法】归并排序与快速排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       🔥🔥 欢迎来到小林的博客!!
      🛰️博客主页:✈️小林爱敲代码
      🛰️博客专栏:✈️ 算法训练笔记
      🛰️社区 :✈️ 进步学堂
      🛰️欢迎关注:👍点赞🙌收藏✍️留言

前言

今天给大家分享两种排序,一种是快排,一种是归并。它们的时间复杂度都是 O(n * logn),而归并要求的空间复杂度是O(N)。归并具有稳定性,快排不具备稳定性。

快速排序

快速排序我们需要借助一个key值,我们拿升序排序来举例。 我们在数组中随机取一个key值,随后用两个指针,一个指针从最左端开始。另一个指针从最右端开始,左指针先走,遇到比key大的值停下。随后右指针也相继往前走,遇到小于key的值停下。随后交换这两个值,走完一遍就完成了单趟排序,随后我们再把这段数组分割成两部分重复以上步骤。我们的key值就取数组的中间值。

归并排序和快速排序哪个空间复杂度最大,算法训练笔记,数据结构与算法,算法,排序算法

随后我们再把数组从 key值所在的下标划分为两半,继续重复先前的步骤,最后即可完成排序。

快排代码模板:

#include<iostream>
using namespace std;

const int N = 1e6;
int q[N];
int n;

void sort_quick(int q[],int l , int r)
{
    if(l >= r) return;
    int i = l - 1, j = r + 1,x = q[(l+r)/2];
    while(i < j)
    {
        do i++;while(q[i] < x); //找到的值>= x
        do j--;while(q[j] > x); //找到的值<= x
        if(i<j) swap(q[i],q[j]);//两个值进行交换
    }
    sort_quick(q,l,j); // l - j这段区间继续排
    sort_quick(q,j+1,r); // j + 1 - r这段区间继续排
}
int main()
{
    scanf("%d",&n);
    for(int i = 0 ;i < n ; i++) scanf("%d",&q[i]);
    sort_quick(q,0,n-1);
    for(int i = 0 ;i < n ; i++) printf("%d ",q[i]);
    return 0;
}

归并排序

归并排序,我们需要额外借助一个和排序数组一样长的tmp数组。然后取一个mid点,为数组的中点,数组的l - mid 为一个区域, mid + 1 - r 为一个区域。对这两个区域的值进行比较,把较小(降序取较大)的值放入tmp数组中。而归并的情况必须保证2个数组是有序的,所以我们先递归,再归并。递归的最后一层只有2个数进行比较。

归并排序前半部分过程:

归并排序和快速排序哪个空间复杂度最大,算法训练笔记,数据结构与算法,算法,排序算法

后面半部分和前面半部分逻辑完全相同。到最后一次归并的时候,我们就可以保证mid左右两边是有序的。

最后一次归并时的数组:

归并排序和快速排序哪个空间复杂度最大,算法训练笔记,数据结构与算法,算法,排序算法

最后一次归并过程:

归并排序和快速排序哪个空间复杂度最大,算法训练笔记,数据结构与算法,算法,排序算法

归并排序代码模板:

#include<iostream>
using namespace std;

const int N = 1e6 + 10;
int n;
int q[N],tmp[N];

void Merge_sort(int q[],int l ,int r)
{
    if(l >= r) return;
    int mid = l + r >> 1;
    Merge_sort(q,l,mid),Merge_sort(q,mid+1,r); //先对左右两边进行归并
    int i = l,j = mid + 1, k = 0;
    while(i <= mid && j <= r) //有一边到达末尾结束循环
        if(q[i] <= q[j]) tmp[k++] = q[i++];
        else tmp[k++] = q[j++];
    while(i <= mid) tmp[k++] = q[i++]; //如果 i - mid 数组中还有元素,放进tmp
    while(j <= r) tmp[k++] = q[j++]; //如果 j - r 数组中还有元素,放进tmp
    for( i = l , j = 0; i <= r ; i++,j++)q[i] = tmp[j]; //把tmp里的元素导进数组
}


int main()
{   
    scanf("%d",&n);
    for(int i = 0 ; i < n ; i++) scanf("%d",q+i);
    Merge_sort(q,0,n-1);
    for(int i = 0 ; i < n ; i++) printf("%d ",q[i]);
    return 0;
}

总结:

归并排序和快速排序思想相同,只不过归并排序有严格mid点,必须从中间开始分裂。而快排不需要,快排只需要把两个坐标相遇的点当成划分点即可。相比于快排,归并的空间复杂度更高,因为需要一个额外的数组来存储排序后的值。而归并的稳定性也是优于快排,归并是稳定的,而快排是不稳定的。文章来源地址https://www.toymoban.com/news/detail-803351.html

到了这里,关于【排序算法】归并排序与快速排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 插入,选择,堆,快速排序算法思想与复杂度

    目录 插入排序 思想 算法步骤 代码 复杂度 选择排序 思想 算法步骤 代码 复杂度 堆排序  思想 算法步骤 代码 复杂度  快速排序  思想 算法步骤 代码 复杂度 稳定性 插入排序是一种简单直观的排序算法。它的工作原理是将数组分为 已排序 和 未排序 两部分,然后依次将未

    2024年02月15日
    浏览(10)
  • 快速排序算法详解(原理,时间复杂度,实现代码)

    快速排序算法详解(原理,时间复杂度,实现代码)

    快速排序算法详解(原理、实现和时间复杂度) 快速排序是对冒泡排序的一种改进,由 C.A.R.Hoare(Charles Antony Richard Hoare,东尼·霍尔)在 1962 年提出。 快速排序的基本思想是 :通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据

    2024年02月13日
    浏览(9)
  • 算法的时间复杂度和空间复杂度

    算法的时间复杂度和空间复杂度

    目录 本章重点 一 时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3 常见的时间复杂度的计算 二 空间复杂度 三 常见复杂度对比 四 复杂度的oj练习 4.1 消失的数字 4.2 旋转数字 每一天都是人生限定,每一天都值得100%努力 (1)算法效率(2)时间复杂度(3)空间复

    2024年02月01日
    浏览(5)
  • 算法的时间复杂度与空间复杂度

    算法的时间复杂度与空间复杂度

    1.算法效率 2.时间复杂度 3.空间复杂度 4.复杂度oj题目 1.算法效率 1.1 如何衡量一个算法的好坏 一辆车的好坏我们可以从价格,油耗...... 方面来衡量,但衡量一个算法的好坏我们该从哪一个方面入手呢?比如斐波那契数列: 斐波那契数列的递归实现方式非常简洁,但简洁一定

    2024年02月15日
    浏览(9)
  • 算法之【时间复杂度】与【空间复杂度】

    算法之【时间复杂度】与【空间复杂度】

    目录 一、算法 1、算法定义 2、两种算法的比较 3、算法的特性 4、算法设计的要求 二、算法的复杂度 1、时间复杂度 1.1定义 1.2大O的渐近表示法 1.3推导大O阶方法 1.4最坏情况与平均情况 1.5常见的时间复杂度计算示例 🍂常数阶: 🍂线性阶:  🍂对数阶: 🍂平方阶: 2、空间

    2024年02月05日
    浏览(14)
  • 【算法基础】时间复杂度和空间复杂度

    【算法基础】时间复杂度和空间复杂度

    1 算法的评价 2 算法复杂度 2.1 时间复杂度(Time Complexity) 2.1.1 如何计算时间复杂度: 2.1.2 常见的时间复杂度类别与示例 2.2 空间复杂度 2.2.1 如何计算空间复杂度 2.2.2 常见的空间复杂度与示例 3 时间复杂度和空间复杂度计算示例 例子1:计算数组中所有元素的和。 例子2:快

    2024年02月08日
    浏览(12)
  • 算法学习22:时间复杂度 和 空间复杂度

    算法学习22:时间复杂度 和 空间复杂度

    提示:以下是本篇文章正文内容: 😍😍😍文章链接👍👍👍 提示:这里对文章进行总结: 💕💕💕

    2024年04月22日
    浏览(25)
  • 算法的时间复杂度、空间复杂度如何比较?

    算法的时间复杂度、空间复杂度如何比较?

    目录 一、时间复杂度BigO 大O的渐进表示法: 例题一: 例题2: 例题3:冒泡排序的时间复杂度 例题4:二分查找的时间复杂度 书写对数的讲究: 例题5:  实例6: 利用时间复杂度解决编程题 ​编辑思路一: 思路二: 源码: 思路三: 回顾位操作符 二、空间复杂度详解 概念

    2024年02月15日
    浏览(7)
  • 如何衡量算法的效率?时间复杂度&&空间复杂度

    如何衡量算法的效率?时间复杂度&&空间复杂度

    本篇博客会讲解如何衡量一个算法的效率。衡量算法的效率,主要有2个维度,分别是:时间复杂度和空间复杂度。 时间复杂度用来衡量算法的时间效率。时间复杂度越低,算法的耗时越短,效率则越高。 空间复杂度用来衡量算法的空间效率。空间复杂度越低,算法占用的空

    2023年04月20日
    浏览(10)
  • 数据结构:算法(特性,时间复杂度,空间复杂度)

    数据结构:算法(特性,时间复杂度,空间复杂度)

    算法(Algorithm)是对 特定问题求解步骤 的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。 一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成。 算法必须是有穷的,而程序可以是无穷的 算法中每条指令必须有确切的含义,对于

    2024年02月06日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包