时间复杂度O(nlogn)
用处一就是求逆序对的个数
首先保证两个数组是有序的,然后是利用中间数组的插入排序
归并排序本身很好理解。详情看代码即可
<span style="font-size:18px;">#include <iostream>
#include <cstdio>
using namespace std;
//将有二个有序数列a[first...mid]和a[mid...last]合并。
void mergearray(int a[], int first, int mid, int last, int temp[])//a表示待排序的数组。first表示第一个元素,last表示最后一个元素
{
int i = first, j = mid + 1;//将从first到last的数组a分为两部分,左侧和右侧,且两侧都已经是排好序的了
int k = 0;
while (i <= mid && j <= last)
{
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= mid)
temp[k++] = a[i++];
while (j <= last)
temp[k++] = a[j++];
//将中间数组的内容全部写入到待排序数组中
for (i = 0; i < k; i++)
a[first + i] = temp[i];
}
void mergesort(int a[], int first, int last, int temp[])//a为待排序的数组.first表示第一个元素,last表示最后一个元素
{
if (first < last)
{
int mid = (first + last) / 2;
mergesort(a, first, mid, temp); //左边有序
mergesort(a, mid + 1, last, temp); //右边有序
mergearray(a, first, mid, last, temp); //再将二个有序数列合并
}
}
int main()
{
int a[1000];
int p[1000];
int n;
printf("请输入数组的长度");
cin>>n;
for(int i = 0; i < n; i ++)
{
cin>>a[i];
}
mergesort(a, 0, n - 1, p);
for(int i = 0; i < n; i ++)
{
cout<<a[i]<<endl;
}
}
</span>
此为已知两个有序数组再排序
<span style="font-size:18px;"> //经典的归并代码
int i = 0,j = 0,k = 0;
while (i<k1 && j<k2) {
if (pcmp(ying[i],shu[j])) {
c[k++]=ying[i++];
}
else {
c[k++]=shu[j++];
}
}
while (i<k1) c[k++]=ying[i++];
while (j<k2) c[k++]=shu[j++];
}</span>