归并排序算法( 分而治之算法,O(nlogn)和快排算法速度一样 )

二分查找 归并排序 快排 详解C++ 这三个排序算法一直是面试的重点,大多数都是C语言写的,今天整理了一下C++的写法,思想都差不多。这几个排序经常忘记,今天抽空记在这,以便自己以后查阅,不对的地方,也欢迎大家评论,不吝指正,谢谢! 二分查找(时间复杂度是O(logn)) 二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果xa[n/2],则只要在数组a的右半 阅读详情

 

归并排序是稳定排序,它也是一种十分高效的排序,能利用完全二叉树特性的排序一般性能都不会太差。java中Arrays.sort()采用了一种名为TimSort的排序算法,就是归并排序的优化版本。从上文的图中可看出,每次合并操作的平均时间复杂度为O(n),而完全二叉树的深度为|log2n|。总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。

  • 时间复杂度:O(nlogn)

  • 空间复杂度:O(N),归并排序需要一个与原数组相同长度的数组做辅助来排序

  • 稳定性:归并排序是稳定的排序算法,temp[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];这行代码可以保证当左右两部分的值相等的时候,先复制左边的值,这样可以保证值相等的时候两个元素的相对位置不变。

 

 

 

#include<bits/stdc++.h>
using namespace std;
void sort(int left,int right);
void merge(int left,int mid,int right);

int len;
int arr[10];
int arr1[10];

int  main()
{
    for(int i=10;i>=1;i--)
    {
        arr[i]=i;
    }
    len=sizeof(arr)/sizeof(int);
    sort(0,len-1);
    for(int i=10;i>=1;i--)
    {
        cout<<arr[i]<<" ";
    }
    return 0;
}

void sort(int left,int right)
{
    if(left<right)//值为两个时也可以实现排序。例如0,1,中间值为0
    {
        int mid = (left+right)/2;

        sort(left,mid);//左边归并排序,使得左子序列有序
        //merge(left,mid);//将两个有序子数组合并操作

        sort(mid+1,right);//右边归并排序,使得右子序列有序
        //merge(mid+1,right);//将两个有序子数组合并操作

        merge(left,mid,right);//将两个有序子数组合并操作
    }
}

void merge(int left,int mid,int right)
{

    int i = left;//左序列指针
    int j = mid+1;//右序列指针
    int t = 0;//临时数组指针

    while (i<=mid && j<=right)
    {
        if(arr[i]<=arr[j])
        {
            arr1[t++] = arr[i++];
        }
        else
        {
            arr1[t++] = arr[j++];
        }
    }
    while(i<=mid) //将左边剩余元素填充进temp中
    {
        arr1[t++] = arr[i++];
    }
    while(j<=right) //或者将右序列剩余元素填充进temp中
    {
        arr1[t++] = arr[j++];
    }

    t = 0;
    //将temp中的元素全部拷贝到原数组中
    while(left <= right)
    {
        arr[left++] = arr1[t++];
    }
}

 

 

package sortdemo;

import java.util.Arrays;

/**
 * Created by chengxiao on 2016/12/8.
 */
public class MergeSort {
    public static void main(String []args){
        int []arr = {9,8,7,6,5,4,3,2,1};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void sort(int []arr){
        int []temp = new int[arr.length];//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
        sort(arr,0,arr.length-1,temp);
    }
    private static void sort(int[] arr,int left,int right,int []temp){
        if(left<right){
            int mid = (left+right)/2;
            sort(arr,left,mid,temp);//左边归并排序,使得左子序列有序
            sort(arr,mid+1,right,temp);//右边归并排序,使得右子序列有序
            merge(arr,left,mid,right,temp);//将两个有序子数组合并操作
        }
    }
    private static void merge(int[] arr,int left,int mid,int right,int[] temp){
        int i = left;//左序列指针
        int j = mid+1;//右序列指针
        int t = 0;//临时数组指针
        while (i<=mid && j<=right){
            if(arr[i]<=arr[j]){
                temp[t++] = arr[i++];
            }else {
                temp[t++] = arr[j++];
            }
        }
        while(i<=mid){//将左边剩余元素填充进temp中
            temp[t++] = arr[i++];
        }
        while(j<=right){//将右序列剩余元素填充进temp中
            temp[t++] = arr[j++];
        }
        t = 0;
        //将temp中的元素全部拷贝到原数组中
        while(left <= right){
            arr[left++] = temp[t++];
        }
    }
}

 

[小技巧] 如何复制知乎电子书中的文字和图片 文章目录一、背景二、复制文字1.最简单的方法(适合短小文字)2. 进阶方法(适合大段文字)三、复制图片四、注意事项 一、背景 有时候希望从书中摘录一部分文字作为笔记,但是知乎电子书阅读时候是禁止copy的,要么手打,要么OCR,给学习带来了一些不便。 审查元素后发现,知乎电子书是把文字分成一段一段的,试图F12直接copy不太方便。 本问将以谷歌Chrome浏览器为例,给出复制小技巧。 二、复制文字 1.最简单的方法(适合短小文字) 选中你需要的文字,左键单击不放,直接拖到地址栏。 然后可以从地址栏中 阅读详情

相关推荐

Unity游戏开发实战:用柏林噪声打造3D随机地形(附完整C#代码)

本文详细介绍了如何在Unity游戏开发中使用柏林噪声算法生成3D随机地形,包含完整的C#代码实现。从基础柏林噪声原理到高级参数控制,再到性能优化和常见问题解决,帮助开发者掌握程序化地形生成技术,打造丰富多变的游戏世界。

weixin_29281941的博客 98

十大经典排序算法-归并排序算法详解

一、什么是归并排序 1.概念 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,归并排序对序列的元素进行逐层折半分组,然后从最小分组开始比较排序,合并成一个大的分组,逐层进行,最终所有的元素都是有序的 2.算法原理 这是一个无序数列:4、5、8、1、7、2、6、3,我们要将它按从小到大排序。按照归并排序的思想,我们要把序列逐层进行拆分 序列逐层拆分如下 然后从下往上逐层合并,首先对第一层序列1(只包含元素4)和序列2(只包含元素5)进行合并 创建一个大序列,序列长度为两个小序列长度

qq_35344198的博客 12万+

博途的HMI(触摸屏)的应用

触摸屏(HMI):用于控制PLC,可认为是小型上位机(用于控制PLC的都可认为是上位机)上位机(PC Station):将触摸屏升级为电脑----工控机(工业控制的机器)用博途编写西门子的触摸屏和上位机。

王阿妹小天才的博客 2674

排序算法系列:归并排序算法

概述 上一篇我们说了一个非常简单的排序算法——选择排序。其复杂程序完全是冒泡级的,甚至比冒泡还要简单。今天要说的是一个相对比较复杂的排序算法——归并排序。复杂的原因不仅在于归并排序分成了两个部分进行解决问题,而是在于,你需要一些算法的思想支撑。 归并排序和之前我写的一篇博客《大数据算法:对5亿数据进行排序》有很多相似的地方,如果你感兴趣,也可以去看看那一篇博客。 ...

weixin_30567225的博客 1781

MIT 6.824分布式 LAB4A:ShardCtrler

lab 4要求实现一个使用raft共识算法的分片存储系统。而在lab 4a中,我们仅需实现分片控制器的功能。lab4中的分片存储系统有多个分片,这些数据分布在众多分片上,而每个分片都对应着一个集群组,可能一个集群组负责多个分片,一个集群组内的所有服务器都会使用raft共识算法进行状态的复制。而本实验的重点为分片控制器,主要负责的工作是对集群组和分片之间关系的管理,我们仅需在/src/shardctrler文件夹中对client.go,server.go,common.go这三个文件进行修改即可。注意事项(实

MarksSa的博客 831

【推荐算法】召回模型总结

【推荐算法】召回模型总结

m0_48086806的博客 6237

【算法系列 | 4】深入解析排序算法之——归并排序

排序算法是很常见的一类问题,主要是将一组数据按照某种规则进行排序。以下是一些常见的排序算法:冒泡排序(Bubble Sort)插入排序(Insertion Sort)选择排序(Selection Sort)归并排序(Merge Sort)快速排序(Quick Sort)堆排序(Heap Sort)归并排序(Merge Sort)是一种基于分治思想的排序算法,它将待排序的数组分成两部分,分别对这两部分递归地进行排序,最后将两个有序子数组合并成一个有序数组。

颜淡慕潇 2万+

第一节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门

vben5 快速入门。 Vben Admin 框架新出的版本V5.5.4,而之前的Vben Admin 2.x 目前已存档,仅进行重大问题修复。之前在2.x版本曾经简单完成了一版专栏文章,当时也是收获了一些好评和建议。本次决定在v5 版本基础上再完成一次前后端的搭建。希望大家继续多多支持。项目精简后,再次启动项目,执行 pnpm run dev点击登录,可以看到接口报错,现在前端请求的后端有报错,下一节处理这部分逻辑。

cuiwin的专栏 7059

图解归并排序,带你彻底了解清楚!

写在前面: 大家好,我是时光。 今天给大家带来的是排序算法中的归并排序,这种排序需要拆分归并。 我采用图解方式讲解,争取写透彻。话不多说,开始! 思维导图: 归并排序思维导图 1,归并排序的概念 1.1,算法介绍 和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

程序员的时光 2万+

【深度学习新浪潮】OpenClaw技术架构详解:从核心组件到生产级优化

OpenClaw 以三层解耦架构 + 四大核心模块为基础,实现了本地优先、易部署、易扩展、易优化的 AI 智能体平台。开发者可通过极简部署快速落地,再通过量化、缓存、并发、分布式等手段持续优化性能,适合从个人助理到企业级自动化的全场景应用。

专注:太空算力、AI infra、异构调度、大模型成本工程 2920

第一部分:VTK基础入门(第1章:VTK简介与概述)

VTK简介与核心特性概述 VTK(Visualization Toolkit)是一个开源的跨平台C++类库,专用于3D计算机图形学、图像处理和科学可视化。由Kitware公司开发,VTK自1993年起源以来,经历了开源化、成熟化和现代化多个发展阶段,现已成为科学可视化的核心工具之一。 VTK的核心特性包括: 管道架构:模块化设计实现数据流管理 丰富的数据支持:处理多边形数据、图像数据等 强大的渲染能力:集成OpenGL,支持多种渲染技术 最新版本VTK 9.4.2增强了现代C++支持,优化了内存管理,并提升

仰望星空的博客 2356

【数据结构】排序算法系列——归并排序(附源码+图解)

它的特点在于并不是一开始就将整个数组进行归类和调整,而是以一定的间隔数分成多次小的排序,最后再逐渐将小的排序的范围变大,最后变大到整个数组时,已经完全有序。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。界定比较的数据个数:一般按照2的倍数增长:两个互相比较、四个互相比较、八个互相比较…总的来说,分治法也可以被称作一种算法,它是一种基于递归的、“分而治之”的算法思想。3.合并这些子问题的解成原问题的解。

Skrrapper的博客 4465

【GlobalMapper精品教程】001:GlobalMapper23+24+25 Pro-x64中文汉化版安装教程(附软件包下载)

Global Mapper 23+V24+V25中文汉化版安装教程及免费下载地址,是一款非常专业的地图绘制软件,功能非常的丰富,内置距离和面积计算,包括光栅混合、对比度调节、海拔高度查询、视线计算以及一些高级功能,通过地表数据观察分水岭、对3Dpoint数据转换为三角多边形和网格化等设置。本文讲解GlobalMapper23.1 Pro-x64安装过程。

智慧空间实验室 3万+

算法复杂度O(1),O(n),O(logn),O(nlogn)的含义

时空复杂度概述 首先o(1), o(n), o(logn), o(nlogn)是用来表示对应算法的时间复杂度,这是算法的时间复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。 算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行这个算法所需要的计算工作量; 空间复杂度是指执行这个算法所需要的内存空间; 时间和空间都是计算机资源的重...

heihei2017的博客 9235

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

排序算法之归并排序

归并排序和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。

9288

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

O(NlogN)的排序算法——左程云算法与数据结构教程2

2.O(NlogN)的排序算法 1.递归 递归行为 压栈, 压栈结束之后的操作可以看成树的后根遍历 递归时间复杂度估计 master公式:T(N)=a*T(N/b)+O(N^d) T(N):母问题 a*T(N/b):子问题(需要规模均分) O(N^d):附加操作 使用 例子: T(N)=2*T(N/2)+O(1),由参数关系得到时间复杂度为O(N) 小..

weixin_42884910的博客 985

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

O(nLogn)的归并排序

之前几篇文章我介绍了三种O(n²)的排序算法《O(n²)的三个排序算法》(选择排序、插入排序和冒泡排序)以及它们的优化,然后顺便还写了一篇希尔排序的文章《插入排序的优化之希尔排序》,但是其实用的比较多的还是直接插入排序,它们比较适合于小规模数据的排序 。下面我将记录时间复杂度为nlog(n)的几种排序算法之一 —— 归并排序算法,这种排序算法适合大规模的数据排序,比之前的O(...

一枚野生程序员 —— Tim 761

归并排序 详解

注:内容,图片来自于慕课网liuyubobobo老师的课程。 算法复杂度:O(nlogn); 也许有很多同学说,原来也学过很多O(n^2)或者O(n^3)的排序算法,有的可能优化一下能到O(n)的时间复杂度,但是在计算机中都是很快的执行完了,没有看出来算法优化的步骤,那么我想说有可能是你当时使用的测试用例太小了,我们可以简单的做一下比较: 当数据量很大的时候 nlogn的优势将会比...

k_koris的博客 28万+

nlogn级别的排序算法(1)归并排序

nlogn级别的排序算法(1)归并排序nlogn到底比n^2快了多少?如下图,当待排序的数组长度达到1000时,nlogn的效率是n^2的1000倍……而这,可能是一天和三年的区别。归并排序基本思路 一个归并过程为:将数据一分为二,将两部分数据分排序,然后将这两个有序数组归并为一个数组; 实际过程中,数据可以不断的往下细分,直到只剩下一个数组元素为止。因此,算法应该采用递归的思想,即长度为1的数组排

佳佳的博客 2089

2.O(NlogN)的排序算法

认识O(NlogN)的排序算法 1.剖析递归行为及其时间复杂度的估算 递归过程:递归过程是一个多叉树,计算所有树的结点的过程就是利用栈进行后序遍历,每个结点通过自己的所有子结点给自己汇总信息之后才能继续向上返回,栈空间就是整个树的高度。 例题①用递归方法找一个数组中的最大值。 int process(vector<int> &nums, int L, int R) { if (L == R) { return nums[L]; } //>&g

weixin_44897707的博客 782

快排和堆排

一、快速排序 最常用的排序算法,速度通常也是最快的。 时间复杂度:O(nlogn) 最坏:O(n^2) 空间复杂度:O(nlgn) 不稳定(比如 5 3 3 4 3 8 9 10 11 这个序列,在中枢元素5和3交换就会把元素3的稳定性打乱) 实现原理: 快排主要是通过选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都 在右边(一般是无序的)。依此递归,达到总体待排...

Snowing1234_5的博客 4010

时间复杂度o(1), o(n), o(logn), o(nlogn)的理解

算法时间复杂度

u013367040的博客 2212

【笔记】有话说+2.认识O(NlogN)的排序

原本有些迷茫,因为学习这块内容并没有自上而下的需求,更谈不上喜欢,我到底该不该花时间去学这个,答案是我也不知道,先学着吧,总归是有用的,说不定哪天我就悟了。

m0_55041773的博客 274

归并排序(看了就会)

归并排序,是创建在归并操作上的一种有效的排序算法。上图中首先把一个未排序的序列从中间分割成2部分,再把2部分分成4部分,依次分割下去,直到分割成一个一个的数据,再把这些数据两两归并到一起,使之有序,不停的归并,最后成为一个排好序的序列。不管元素在什么情况下都要做这些步骤,所以花销的时间是不变的,所以该算法的最优时间复杂度和最差时间复杂度及平均时间复杂度都是一样的为:O( nlogn )归并排序算法中,归并最后到底都是相邻元素之间的比较交换,并不会发生相同元素的相对位置发生变化,故是稳定性算法。

Circ 2万+

快排面试可能会这么问

快速排序算法 本文会从 快排的概述、适用场景、最坏、最好、平均时间复杂度,是否是原地算法,为什么比归并排序好这几个方面进行阐述。 快速排序(Quick Sort)算法是由英国计算机科学家 Tony Hoare 在 1959年发明的。“Quick Sort” 的名字来源于这样一个事实:快速排序速度比任何常见排序算法都要快得多(快两到三倍)。 它是最有效的排序算法之一。它将需要排序的数组分割(splitting)成更小的数组,并且基于与选定的“枢轴”(pivot)元素的比较(comparison)交换元素。

OrdinaryMatthew的博客 555

算法学习 - 链表之归并排序_O(1)空间_O(NlogN)时间_C++

归并排序 归并排序我在之前已经讲过了,并且给了在数组的数列的情况下的归并排序方法,而排序的时间复杂度为O(NlogN).想看的话链接如下: 归并排序,快排,冒泡排序 但是这个归并排序有一个缺点:需要O(n)的额外空间。 那么这个缺点在什么情况下会解决呢?就是数列是以链表形式存储的时候!就不需要额外的申请O(n)级别的空间。 那么我们为什么要用归并排序呢? 不是还有快排,堆

累了就歇一会 2147
上一篇: C++中随机函数rand()和srand()的用法
下一篇: Codeforces Round #554 (Div. 2) B. Neko Performs Cat Furrier Transform (二进制的位运算的设计与思考)
while_black
博客等级 码龄9年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值