基础算法——归并排序

算法思想

归并排序的核心就在于“归”和:“并”。其是一种采用分治策略来求解问题的典型算法。其算法思想十分简单:

  • 分:确定分界点:mid=(l+r)/2;
  • 将分的两个子序列递归调用归并排序进行排序。
  • 治:将两个子序列合并成一个有序序列。 alt

上述图片链接

代码实例

//归并排序
/*
    思路:1.确定分界点:mid=(l+r)/2
        2.递归排序 left right
          3.归并 :合二为一*/
#include <iostream>
using namespace std;

const int N=1000000;
int n;
int q[N],temp[N];  //temp作为辅助数组

void merge_sort(int q[],int l,int r)
{
    if(l>=r) return;

    int mid=l+r>>1; //其实就是(l+r)/2

    merge_sort(q,l,mid);
    merge_sort(q,mid+1,r);

    int k=0,i=l,j=mid+1;
    while (i<=mid&&j<=r)
    {
        if(q[i]<=q[j]) temp[k++]=q[i++];
        else temp[k++]=q[j++];
    }
    while(i<=mid) temp[k++]=q[i++];
    while(j<=r) temp[k++]=q[j++];

    //把数从temp中拿到q数组中
    for (i=l,j=0;i<=r;i++,j++)
    {
        q[i]=temp[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]<<endl;

    return 0;
}

算法复杂度

  • 时间复杂度:需要进行log2n趟的2-路归并排序,每趟2-路归并的复杂度为O(n),因此总的时间复杂度为:O(nlog2n)。
  • 空间复杂度:使用了一个辅助数组来存放排序结果,因此空间复杂度为O(N)。
数据结构和算法 文章被收录于专栏

该专栏内容包含常见的数据结构和一些算法知识。若有错误请各位指正。 //里面所有代码均通过vscode调试。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务