归并排序也是一种常用的排序算法, 其时间复杂度为O(n*logn), 它的基础是分治的思想。
其基本思路就是把数组分成两组A,B, 如果这两组内的数据都是有序的, 那么就可以很方便的对这两组数据进行合并排序。
但是如何让这两组数据有序呢?
归并法的思想就是把A,B两组各自再分成两组, 依次类推, 当分出来的小组数据只有一个的时候, 即可以认为小组数据已经达到了有序。
然和合并相邻的两个小组就OK了~
代码:
#include<stdio.h>
#include <iostream>
using namespace std;
#define SIZE 10
//合并数组的前半部分和后半部分, 前提就是前后两个子数组分别都已经排好序了
void mergeArray(int a[], int first, int mid, int last) {
int i, j, m, n;
i = first, m = mid;
j = mid+1, n = last;
int k = 0;
int temp[SIZE];
while(i<=m && j<=n) {
if(a[i] < a[j]) {
temp[k++] = a[i++];
} else {
temp[k++] = a[j++];
}
}
while(i<=m) temp[k++] = a[i++];
while(j<=n) temp[k++] = a[j++];
for(i=0; i<k; i++) {
a[first+i] = temp[i];
}
}
//归并排序
void merge_sort(int a[], int start, int end) {
int mid = (start+end)/2;
if(start<end) {
merge_sort(a, start, mid);
merge_sort(a, mid+1, end);
mergeArray(a, start, mid, end);
}
}
int main() {
int a[SIZE];
int i;
int T;cin>>T;
while(T--){
int n;
cin>>n;
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
merge_sort(a, 0, n-1);
for(i=0; i<n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
}
return 0;
}