归并排序的3种实现

python3实现冒泡排序、快速排序、插入排序、归并排序、原地归并排序、堆排序、桶排序、希尔排序、直接选择排序、计数排序、基数排序 冒泡排序 #coding:utf-8 # 冒泡排序 # 最差时间复杂度O(n^2),平均时间复杂度O(n^2) def bubble_sort(lst): for i in range(len(lst)-1): for j in range(len(lst)-i-1): if lst[j]>lst[j+1]: # 相邻数据比较大小 lst[j+1],lst[j]=lst[j],lst[j+1] if __name__== 阅读详情

归并排序适用于外部排序,是一种稳定的排序。算法很很好的体现了分治法的思想。
时间复杂度O(nlogn)(最好最坏平均都是它)
空间复杂度O(n) (如果使用的是链表,空间复杂度为O(1))

数组递归实现:

void Merge(int* arr,int* tmp,int left,int right,int rightEnd){
    int leftEnd = right-1;
    int start = left;
    int len = rightEnd - left + 1;
    while (left<=leftEnd && right<=rightEnd)
    {
        if (arr[left] > arr[right]){
            tmp[start++] = arr[right++];
        }
        else{
            tmp[start++] = arr[left++];
        }
    }
    while (left <= leftEnd)
    {
        tmp[start++] = arr[left++];
    }
    while(right<=rightEnd){
        tmp[start++] = arr[right++];
    }
    for (int i = 0; i < len; i++, rightEnd--){
        arr[rightEnd] = tmp[rightEnd];
    }
}
void split(int* arr,int* tmp,int left,int rightEnd){
    if (left < rightEnd){
        int center = (rightEnd + left) / 2;
        split(arr, tmp, left, center);
        split(arr, tmp, center + 1, rightEnd);
        Merge(arr, tmp, left, center + 1, rightEnd);
    }
}
void Merge_Sort(int* arr,int len){
    int *tmp = (int*)malloc(sizeof(int)*len);
    split(arr,tmp,0,len-1);
    free(tmp);
}

数组非递归实现:

void Merge(int* arr,int* tmp,int left,int right,int rightEnd){
    int leftEnd = right - 1;
    int start = left;
    while (left <= leftEnd && right <= rightEnd){
        if (arr[left] > arr[right]){
            tmp[start++] = arr[right++];
        }
        else{
            tmp[start++] = arr[left++];
        }
    }
    while (left <= leftEnd){
        tmp[start++] = arr[left++];
    }
    while (right <= rightEnd){
        tmp[start++] = arr[right++];
    }
}
void MergeSort(int* arr,int* tmp,int n,int length)//length当前有序子列的长度
{
    int i;
    for (i = 0; i <= n - 2 * length; i += 2 * length){
        Merge(arr,tmp,i,i+length,i+2*length-1);
    }
    //最后剩下两个子列,进行归并
    if (i + length < n){
        Merge(arr,tmp,i,i+length,n-1);
    }
    else{//只剩最后一个子列,不能成对
        for (int j = i; j < n; j++){
            tmp[j] = arr[j];
        }
    }
}
void Merge_Sort(int* arr,int n){
    int lenght = 1;
    int* tmp = (int *)malloc(sizeof(int)*n);
    while (lenght < n){
        MergeSort(arr,tmp,n,lenght);
        lenght *= 2;
        MergeSort(tmp,arr,n,lenght);
        lenght *= 2;
    }
    free(tmp);
}

链表实现:

void Merge(ListNode* &left,ListNode* right){
    ListNode* tmp = NULL;
    ListNode* head = new ListNode(0);
    head->next = left;
    ListNode* leftPre = head;
    while (left != NULL && right != NULL){
        if (left->val > right->val){
            tmp = right->next;
            leftPre->next = right;
            right->next = left;
            leftPre = leftPre->next;
            right = tmp;
        }
        else{
            leftPre = left;
            left = left->next;
        }
    }
    while (right!= NULL){
        leftPre->next = right;
        leftPre = leftPre->next;
        right = right->next;
    }
    left = head->next;
    delete head;
}
//对链表进行分割
void split(ListNode* &left,ListNode* &right,ListNode* pHead){
    ListNode* low = pHead;
    ListNode* high = pHead;
    while (high->next != NULL && high->next->next != NULL){
        low = low->next;
        high = high->next->next;
    }
    left = pHead;
    right = low->next;
    low->next = NULL;
}
void Merge_Sort(ListNode* &pHead){
    if (pHead == NULL || pHead->next==NULL){
        return;
    }
    ListNode* left = NULL;
    ListNode* right = NULL;
    split(left,right,pHead);
    Merge_Sort(left);
    Merge_Sort(right);
    Merge(left,right);
    pHead = left;//更新pHead
}
80MHz~100MHz频谱分析仪设计 由理论分析可知,经过乘法器后输出的信号为频率为w1+w2的高频信号和w1-w2的低频信号,除了想要采样的直流信号外,最小的信号频率为100kHz。因此,经过一系列推导可以得到该滤波器的元件C1,C2,C3,R1,R2的近似值分别为:C1=2.36nF,C2=32.1nF,C3=1.07nF,R1=1.39k,R2=2.84k。AK,此时的频率w2即为被测信号的频率,待测信号源电压幅度为,因此为了能达到直流采样的设计,我们将本振源的频率输出范围做成80~110 MHz,提高了题目的频率要求。 阅读详情

相关推荐

在VS2019里把JSBSim飞行模型集成到你的C++项目里(附完整配置流程和常见错误解决)

本文详细介绍了如何在Visual Studio 2019中将JSBSim飞行模型集成到C++项目中,包括环境准备、源码编译、项目配置和常见错误解决方案。通过实战技巧和优化建议,帮助开发者高效实现高精度飞行仿真功能,提升开发效率。

weixin_42620202的博客 413

排序【4.1】归并排序(MergeSort)

归并排序(Merge Sort) 1、基本思想: 将两个的有序数列合并成一个有序数列,我们称之为&quot;归并&quot;。 归并排序(Merge Sort)就是利用归并思想对数列进行排序。根据具体的实现,归并排序包括&quot;从上往下&quot;和&quot;从下往上&quot;2种方式。 (1)从下往上的归并排序:将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并;得到若干个长度为2的有序数列,再将这些数列两两合并;得到若干个长度为4..

简之的通向技术之路 1032

[LVGL]:MACOS下使用LVGL模拟器

[LVGL]:MACOS下使用LVGL模拟器

LINKKEEE的博客 2456

数据结构——归并排序

八大排序算法实现之归并排序

m0_63020222的博客 1516

GEOS-Chem笔记——模式下载安装+驱动数据+运行流程

看过我博客的会发现我写了很多CESM的笔记,但是说实话,平时科研我其实更多时候是GEOS-Chemuser。之所以写了很多CESM笔记,其实是因为不会,就边学边写。然后GEOS-Chem已经用比较熟了,所以也没想过做笔记啥的。但是我发现越来越多朋友私信我各种CESM问题,我觉得我可能给大家营造了一种我是CESM达人的错觉。感觉自己有点跑偏了呢。公平起见,我觉得我有必要补充点GEOS-Chem笔记。 GEOS-Chem是研究大气化学的人常用的大气化学传输模式,在全世界范围的大气化学研究组中被广泛使用。不过.

砍柴姑娘Jourosy的博客 1万+

Reeds-Shepp曲线公式推导及代码实现-第三部分(共三部分)

根据原始起点的坐标和航向,将上一小节计算出来的局部进行整体的平移和旋转(与归一化的步骤刚好相反),最终得到全局路径的轨迹。根据计算出来的路径,选择路径最短的轨迹(也可根据我们实际的需要定制选优规则),作为最终的轨迹输出。Reeds-Shepp曲线公式推导及代码实现-第一部分(共三部分)Reeds-Shepp曲线公式推导及代码实现-第二部分(共三部分)的值进行等步长插值,得到每段轨迹对应的生成一系列插值距离列表。根据上一步生成的插值距离列表的值,计算其对应的局部位姿值。后,我们需要根据字段类型(

jianmo的博客 1088

八大排序算法之归并排序(递归实现+非递归实现)

归并排序(递归实现+非递归实现)

小青菜的博客 1万+

Matlab仿真:均匀面阵方向图、均匀线阵方向图、均匀圆阵方向图

其中,阵列方向图是评价阵列性能的重要参数之一。均匀面阵由若干个相同的阵元构成,阵元间等距排列,阵元的方向图形状为一个圆盘。均匀线阵由若干个相同的阵元构成,阵元间等距排列,阵元的方向图形状为一个矩形。本文将采用Matlab进行仿真,分别实现均匀面阵方向图、均匀线阵方向图和均匀圆阵方向图,并对三种阵列进行比较分析。通过以上代码仿真,我们可以对均匀面阵、均匀线阵和均匀圆阵进行方向图的绘制,进一步分析不同阵列在天线性能方面的差异。Matlab仿真:均匀面阵方向图、均匀线阵方向图、均匀圆阵方向图。

2301_79326857的博客 3436

归并排序三种实现方法(递归、非递归和自然合并排序)

1.      递归实现归并排序 1)     基本思想: 将待排元素分成大小大致相同的2个子集,分别对2个子集合进行排序,最终将排好序的子集合合并 就会得到一个排好序的集合 即为所求 设归并排序的当前区间是R[low..high],分治法的三个步骤是: ① 分解:将当前区间一分为二,即求分裂点  ② 求解:递归地对两个子区间R[low..mid]和R[mid+1..high] 进行归并

Christine的专栏 1万+

Python库CloudScraper详细使用(绕过 Cloudflare 的反机器人页面的 Python 模块)

CloudScraper是一个专门用于绕过Cloudflare反机器人保护的Python库,它基于requests库构建,能够处理Cloudflare的5秒盾、WAF和人机验证等防护机制。

数据知道的博客 1万+

零基础做AI漫剧:Kimi K2.5写本 + Flux生图 + Seedance 2.0动效的保姆级教程

很多零基础小伙伴想做AI漫剧,却被“写剧本、画分镜、做动效”三大难题劝退——不会写剧情、不会画插画、不会做动态,觉得门槛太高。其实不用慌!今天就给大家带来保姆级教程,全程用Kimi K2.5(写剧本)、Flux(生分镜图)、Seedance 2.0(做动效)三个工具,不用专业技能,不用手动绘画,零基础也能在1小时内做出1分钟完整AI漫剧,全程步骤拆解、示例齐全,跟着做就能出片!

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 3033

排序之归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。所谓归并,就是将两组有序的数据合成为一组有序的数据,例如有如下两个有序数组,将两个有序数组归并为一个有序数组,这就是一次归并操作。

dong132697的博客 2万+

工业产线瑕疵检测:基于 YOLO 的自动化质检系统实战

从工业瑕疵数据集构建到模型训练,从桌面检测界面到产线适用性优化,本文覆盖了一套工业质检系统的完整路线。这个场景的核心评价指标不是最高精度,而是在保证 recall ≥ 0.95 的前提下尽可能压低 false positive——因为漏检的直接成本(客户投诉、质量事故)远高于误报的成本(人工复检)。部署时先设一个偏低的置信度阈值确保覆盖,再通过持续收集人工复检数据来逐步调优。

m0_71589036的博客 66

快速排序 python3_Python3实现快速排序、归并排序、堆排序

Python3实现快速排序、归并排序、堆排序# -*- coding: utf-8 -*-# @Time : 2019-03-26 16:46# @Author : Jayce Wong# @ProjectName : leetcode# @FileName : sorting.py# @Blog : https://blog.51cto.co...

weixin_39890517的博客 116

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java实现3种归并排序

1. 引言 归并排序的具体内容不再细说,归并排序主要有3种实现: 最普通的归并排序 普通归并排序的优化 自底向上归并排序 2. 普通归并排序的实现 代码如下 import java.util.Arrays; public class MergeSort { private MergeSort() { } public static <E extends Comparable<E>> void sort(E[] arr) { sort(a

热爱技术,热爱生活! 204

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

python3实现归并排序算法图文详解

归并排序做为一种比较经典的排序思路,经常在面试中被提及。即使不直接考察也会换种方式涉及,例如很常见的20G超大文件排序问题。这一节就分解下归并的思路,最后用代码实现一下。下一篇我们进行一下扩展,实现超大文件的排序。 文章目录归并排序代码实现时间复杂度稳定性接下来 归并排序 归并排序(Merge Sort)的主要思想就是化整为零,分批治理,再逐层合并结果。和快排有些许类似,同样也是递归的典型使用场景。 例如有下面的list [38,67,26,11,99,20,45,54] 首先是化整为零,分的方法很多,我

T型人小付的博客 965

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

归并排序之Python3实现和c++实现

归并排序(Merge sort) 1.排序思想 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 图解 2.Python3实现 ##Merge sor...

qq_32531519的博客 377

归并排序相关知识及算法导论第三版2.3-7实现

2.3-7描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素。分析:首先将S进行排序,然后再通过查找算法进行查找。插入排序算法复杂度最差n^2,归并排序最差为nlgn,堆排序为最差为nlgn,快速排序最差为n^2,这里我们直接使用归并排序。所以实现归并排序是第一步。第二步为查找算法,且复杂度不低于nlgn的。首先想到每个数减去...

Oliver_LJF的博客 562

Python3 实现冒泡排序和归并排序

Python3实现冒泡排序和归并排序一、冒泡排序的实现原理思路代码实现小结二、归并排序实现原理思路代码实现小结项目地址 一、冒泡排序的实现 原理思路 就像气泡上升一样,相邻两个数依次两两比较,如果左边的比右边的大,则交换位置。 对给定的一组数据,从第一个数开始,依次对相邻的两个数进行比较,如果左边的数大于右边的数,则交换他们的位置,第一轮过后,最大的那个数位于最后; 然后继续对不包括最后一个数的...

Jock2018的博客 653

3.5 归并排序的java实现

侵权立删 java实现代码如下: 1.排序主方法和合并方法如下: //合并方法 public void merge(int []a,int left,int mid,int right){ int []tmp=new int[a.length];//辅助数组 int p1=left,p2=mid+1,k=left;//p1、p2是检测指针,k是存放指针 ...

c1776167012的博客 182

Python3 实现归并排序

step1 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题; step2 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题 step3 合并:将各个子问题的解合并为原问题的解。 Python # -*- coding: utf-8 -*- ...

从零开始学习python --zeropython 255

3.归并排序Java实现及优化

public class MergeSort { /** * 归并排序,归并array[l,r] * @param array * @param l * @param r */ public static void mergeSort(int array[] ,int l,int r){ if(l>=r){ return ; } int mid ...

cl723401的博客 242

JavaScript实现排序算法(3)——归并排序

归并排序 归并排序的分治思想的典型应用,先分再合 1 算法过程 (从小到大排序) 分治: 1. 将原数列对半分为两个子数列,分别对两个子数列进行排序; 2. 对子数列进行排序时,重复第一步; 合并: 1. 申请空间,大小为两个`已排序的`子数列之和,该空间用来存放合并后的数列; 2. 设定两个指针,最初位置分别为两个子数列的起始位置; 3. 比较两个指针所指向的元素,选择较小的元素放入第一步申请的空间,并移动该指针到下一位; 4. 重复第三步,直至有一个子数列的指针超出数列尾; 5. 将另一个子数列的元素直

weixin_41309331的博客 296

数据结构与算法Java实现(3)——归并排序

结束了快速排序学习之后,对其分段排序的思想的延续便是归并排序。 归并排序是一种稳定的排序算法。 时间复杂度:O(nlogn) ,空间复杂度:O(n),是一种典型的空间换时间的算法。 原理: 归并排序将待排序的元素序列分成两个长度相等的子序列,为每一个子序列排序,然后再将他们合并成一个子序列。合并两个子序列的过程也就是归并。 盗用一张图: 代码实现 import java.util.Arrays;...

Songcz的博客 173

【终极排序-3】归并排序的实现及分析

(1)基本思想: 1. 原理: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and C...

chesuijiong5489的博客 129

用Python实现排序(3)二分/归并排序

和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。 算法描述: 把长度为n的输入序列分成两个长度为n/2的子序列; 对这两

栋栋呀的博客 1180
上一篇: C语言隐式数据类型转换
下一篇: 快速排序递归与非递归实现
_IanXiao
博客等级 码龄12年 84粉丝 241原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值