算法分析:归并排序使用的是分治的思想,分、治、和。不断把数组二分,直到每一个小数组只有一个元素,然后在逐层合并。
时间复杂度:O(nlgn)
#include <bits/stdc++.h>
using namespace std;
void merge1(int a[], int b[], int p, int r, int q)
{
int i = p, j = r+1, k = p;
while(i <= r && j <= q)
{
if(a[i] <= a[j])
{
b[k++] = a[i++];
}
else
{
b[k++] = a[j++];
}
}
while(i <= r)
{
b[k++] = a[i++];
}
while(j <= q)
{
b[k++] = a[j++];
}
for(int i = p; i <= q; i++)
{
a[i] = b[i];
}
}
void MergeSort(int a[], int b[], int p, int q)
{
if(p < q)
{
int mid = (p+q)/2;
MergeSort(a, b, p, mid);
MergeSort(a, b, mid + 1, q);
merge1(a, b, p, mid, q);
}
}
int main()
{
int n;
cin >> n;
int a[n], b[n];
for(int i = 0; i < n; i++)
{
cin >> a[i];
}
MergeSort(a, b, 0, n-1);
for(int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
return 0;
}
打了挺久,挂掉的第一个坑是k的赋值赋成一了。然后第二个就是merge那里没有把数组b赋回给a。这样造成的结果是二次归并以后所出现的结果都是不正确的,那么递归的作用就完全没有起到。递归是为了从小的地方去改变,如果小的地方没有改变,那么归并到大的时候和没有递归是一样的。