时间复杂度:T(n) = O(n㏒n),空间复杂度:S(n) = O(n)
就是将一个大的数组一直二等分,分分分分分.。。。。。
分到只有一个元素的时候,再和上次分离的小伙伴合并在一起,
并且排好序
#include <stdio.h>
#define MAXSIZE 105
int T[MAXSIZE]; //辅助空间
void merge_sort(int a[],int left,int right,int T[]){
if(right - left > 1){
int mid = left + (right - left)/2; //划分
int l = left,r = mid,q = left;
merge_sort(a,left,mid,T); //递归求解
merge_sort(a,mid,right,T); //递归求解
while(l < mid || r < right){
if(r >= right || (l < mid && a[l] <= a[r])){ //条件其实挺细的。。。。
T[q++] = a[l++];
}else
T[q++] = a[r++];
}
for(int i=left ;i<right;i++)
{
a[i] = T[i];
}
}
}
/** 归并排序 */
int main()
{
int a[MAXSIZE],n;
printf("请输入要排序元素的个数:\n");
scanf("%d",&n);
printf("请输入要排序的元素:\n");
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
printf("排序前:\t");
for(int i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
merge_sort(a,0,n,T);
printf("排序后:\t");
for(int i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return 0;
}