基础算法——归并排序
算法思想
归并排序的核心就在于“归”和:“并”。其是一种采用分治策略来求解问题的典型算法。其算法思想十分简单:
- 分:确定分界点:mid=(l+r)/2;
- 将分的两个子序列递归调用归并排序进行排序。
- 治:将两个子序列合并成一个有序序列。
代码实例
//归并排序
/*
思路: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调试。