ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

归并排序

2021-11-09 08:33:57  阅读:166  来源: 互联网

标签:归并 frac help int 复杂度 是不是 序列 排序


归并排序

老师课件

image-20211031173908243

思路:

采用二分的思想,把一个数组分为左边和右边两部分,我先把左边排好序,右边排好序,最后再将这里边合并就是了。思路就是这样子,那这这时候就有人问了,左边怎么排好序?右边又怎么排好呢?好问题,那我们继续来分析。

第一次分完之后,左边是不是有一段序列了,那我对这段序列排序,是不是同样分成左右两部分,然后继续分啊分,到最后是不是左右两边是不是只剩一个数了?一个数是不是相当于排好了序?好,那这时后我们是不是可以进行合并了呀。

然后,问题又来了,我得到了两个有序的序列,怎么把这两个有序的序列合成一个,并且最后合成的序列也是有序的呢?我们可以这样解决这个问题:

我们弄两个指针p1p2 分别指向左边部分和右边部分,然后再搞一个额外的数组help,我们比较这两个指针所指的值,谁小就把谁指向的值存入help中,然后它们就向右走,同样,小的值就放到help中,直到最后把左部分和右部分的数全部放到help中,那我们得到的help数组是不是就是左右两边合并后的数组并且是有序?那这不就做到合并操作嘛!好,下面上代码:

代码

/* 合并操作 */
void merge(int arr[],int l,int mid ,int r){
    int p1=l,p2=mid+1;
    int help[r-l+1],i=0;
    while(p1<=mid && p2<=r){
        help[i++]=arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];
    }
    /* 将没导完的数据导到help */
    while(p1<=mid){
        help[i++]=arr[p1++];
    }
    while(p2<=r){
        help[i++]=arr[p2++];
    }
    /* 将help数组拷贝回给arr,注意,合并的是l到r这个区间,并不是0-尽头 */
    for(int k=0;k<i;k++){
        arr[l+k]=help[k];
    }
}
/* 二分操作 */
void process(int arr[],int l,int r){
    if(l==r){
        return;
    }
    int mid = l+((r-l)/2);
    process(arr,l,mid);      //左边部分
    process(arr,mid+1,r);    //右边
    merge(arr,l,mid,r);      //合并
}
/* 归并排序 */
void merge_sort(int arr[],int n){
    process(arr,0,n-1);
}

时间复杂度分析

二分操作 \(T(\frac{n}{2})\),process中的基础常数时间操作忽略,只看merge 操作,第一个while循环\(O(\frac{n}{2})\) ,第二和第三个循环只会执行其中的一个,复杂度也是\(O(\frac{n}{2})\),最后一个循环为\(O(n)\) ,所以,最后的时间复杂度:

\(T(n)=2T(\frac{n}{2})+O(n)\)

应用master 公式,\(T(n)=O(n*\log{n})\)
该公式在时间复杂度中有给出来

标签:归并,frac,help,int,复杂度,是不是,序列,排序
来源: https://www.cnblogs.com/yongcheng137blogs/p/15527164.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有