自己对归并排序的理解:
归并排序采用分治法来实现,将要排序的数组对半拆分,当拆分到单个元素的时候,在进行合并这时按照一定的顺序合并到临时数组temp中,最后在存入原来的数组中。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#define FRE() freopen("in.txt","r",stdin)
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 5005;
int a[maxn],temp[maxn];//负责度O(N*logN)
void mergearrge(int a[],int st,int mid,int en,int temp[])//合并数组
{
int i = st,j = mid+1;
int k = 0;
while(i <= mid && j <= en)
{
if(a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while(i <= mid)
temp[k++] = a[i++];
while(j <= en)
temp[k++] = a[j++];
for(int i = 0; i < k; i++)
a[st + i] = temp[i];
}
void mergesort(int a[],int st,int en,int temp[])//拆分数组
{
if(st < en)
{
int mid = (st + en) / 2;
mergesort(a, st, mid, temp);
mergesort(a, mid+1, en, temp);
mergearrge(a, st, mid, en, temp);
}
}
int main()
{
a[0] = 5;a[1] = 10;
a[2] = 45;a[3] = 11;
a[4] = -1;a[5] = 900;
mergesort(a, 0, 5, temp);//注意开始和结束下标的填法
for(int i =0; i < 6; i++)
printf("%d ",temp[i]);
return 0;
}