#include<stdio.h>
//归并排序
void merge_sort(int arr[],int fin[],int start,int mid,int end)
{
int i=start;//i代表数组的前一半
int k=start;//k代表整个数组
int j=mid+1;//j代表数组的后一半
while(i!=mid+1 && j!=end+1)//先对整个数组进行判断,对比两个分数组的大小
{
if(arr[i]>arr[j])
fin[k++]=arr[j++];
else
fin[k++]=arr[i++];
}
while(i!=mid+1) //对比完其中一个数组后,只剩另外一个数组,插入到整个数组当中来
fin[k++]=arr[i++];
while(j!=end+1)
fin[k++]=arr[j++];
for(i=start;i<=end;i++)
arr[i]=fin[i];
}
//第二个函数
void merge(int arr[],int fin[],int start,int end)
{
int mid;
if(start<end){
mid=start+(end-start)/2;
merge(arr,fin,start,mid);//开始将整个数组分为两半,此部分为前半部分
merge(arr,fin,mid+1,end);//此部分为后半部分
merge_sort(arr,fin,start,mid,end);//第一个函数,进行合并
}
}
int main()
{
int arr[20]={20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
int fin[20],q;
merge(arr,fin,0,19);
for(q=0;q<20;q++)
printf("%d ",arr[q]);
printf("\n");
return 0;
}
归并排序的时间复杂度为O(nlogn)
空间复杂度为O(n)