首页 > 编程语言 >算法学习笔记(2)——归并排序

算法学习笔记(2)——归并排序

时间:2022-12-09 21:55:28浏览次数:62  
标签:归并 log int merge 算法 区间 排序

归并排序

归并排序的思想是基于分治法,其思路是:

  • 将待排序区间平分成左右两半,左右两侧分别递归地做归并排序。
  • 将这两个有序的区间合并(每次落一个较小的下来),就将这个区间排好序了。

归并排序相比快速排序,几乎没有什么难理解的边界问题。要注意代码中的q[i] <= q[j]时从左半边落下元素,如果改成q[i] < q[j]也是能正确排序的,但是这样会丢失【归并排序是稳定的】这个特性。要保持这个特性,在排序字段相等的时候,应该落下来自左侧区间的元素,所以这里用<=

我们知道,归并排序的过程中,需要对当前区间进行对半划分,直到区间的长度为1。也就是说,每一层的子区间,长度都是上一层的1/2。这也就意味着,当划分到第 \(\log n\) 层的时候,子区间的长度就是1了。

而归并排序的merge操作,则是从最底层开始(子区间为1的层),对相邻的两个子区间进行合并,对于每一层来说,在合并所有子区间的过程中,\(n\) 个元素都会被操作一次,所以每一层的时间复杂度都是 \(O(n)\)。而之前我们说过,归并排序划分子区间,将子区间划分为只剩 \(1\) 个元素,需要划分 \(\log n\) 次。每一层的时间复杂度为 \(O(n)\),共有 \(\log n\) 层,所以归并排序的时间复杂度就是\(O(n\log n)\)。

题目链接:AcWing 787. 归并排序

#include <iostream>

using namespace std;

const int N = 100010;

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 ++];
    while (j <= r)   tmp[k ++] = q[j ++];
    
    for (int i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
}

int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++ ) cin >> q[i];
    merge_sort(q, 0, n - 1);
    for (int i = 0; i < n; i ++ ) cout << q[i] << ' ';
    return 0;
}

标签:归并,log,int,merge,算法,区间,排序
From: https://www.cnblogs.com/I-am-Sino/p/16970097.html

相关文章

  • 算法学习笔记(1)——快速排序
    快速排序算法思想快排的思想是基于分治法,其思路是:确定分界点:给定要排序的数组q,先在数组中找一个数作为分界点值x,分界点可以取左边界值x=q[l],可以取右边界值x=q[r],......
  • crypto-gmsm国密算法库
    crypto-gmsm国密算法库一、开发背景crypto-gmsm国密算法库是国密商密算法(SM2,SM3,SM4)工具类封装,国产密码算法(国密算法)是指国家密码局认定的国产商用密码算法,目前主要使用......
  • 代码随想录算法训练营第三天 | 203.移除链表元素、707.设计链表、206.反转链表
    203. 移除链表元素tag:#链表leetcode地址:203. 移除链表元素代码:functionremoveElements(head:ListNode|null,val:number):ListNode|null{constnewH......
  • hutools密码算法库
    hutool密码算法库一、开发背景Hutool针对BouncyCastle做了简化包装,用于实现国密算法中的SM2、SM3、SM4。国密算法工具封装包括:非对称加密和签名:SM2摘要签名算法:SM3......
  • 统计文件夹大小并排序
    linux:du-sh*2>/dev/null|sort-hrWindows(cygwin/git...):du-sh*2>NUL|sort-hr注意这个sort要用git带的sort.exe而不是System32下面的sort......
  • 【主色提取】模糊C均值(FCM )聚类算法和彩色图像快速模糊C均值( CIQFCM )聚类算法
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • 零基预算法在全面预算管理中的应用
    随着经济不确定因素的不断扩大,大部分企业都或多或少的受到了影响。不难发现,如果仍然使用传统的预算编制方法,似乎并不像以往那样有效。不确定因素的影响使得数据在一定时期的......
  • 字符串的全排列算法讲解
    一、字符串的排列用C++写一个函数,如Foo(constchar*str),打印出str的全排列,如abc的全排列:abc,acb,bca,dac,cab,cba一、全排列的递归实现为方便起见,用123......
  • 冒泡排序算法详解C++程序
    (1)冒泡排序算法:(BubbleSort)首先肯定是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到......
  • 打包matlab代码算法/工程成exe文件方法
    近期自己写的算法需要给其他人员用,但是不能分享源代码,尝试对算法工程打包成exe文件,记录一下打包步骤打包步骤:命令窗口输入指令deploytool,在弹出窗口选择ApplicationComp......