将序列分为两半,对两部分分别排序,再进行合并。
原序列为无序的,所以存在左边某一个元素大于右边或是右边某一个元素小于左边的情况,所以需要对两部分的每个元素进行比较,用一个新的数组来储存答案。
void merge(int nums[],int left,int right)
{
int tmp[10010];//储存新的数组
if(left>=right)
return ;
int mid=(left+right)/2;
merge(nums,left,mid);//递归左边6
merge(nums,mid+1,right);//递归右边
int k=0;
int i=left;
int j=mid+1;
while(i<=mid&&j<=right)//两个数组都有数
{
if(nums[i]<=nums[j])
tmp[k++]=nums[i++];
else
tmp[k++]=nums[j++];
}
//如果有剩余
while(i<=mid)
tmp[k++]=nums[i++];
while(j<=right)
tmp[k++]=nums[j++];
for (i = left, j = 0; i <= right; i ++, j ++ )
nums[i] = tmp[j];
}
时间复杂度为O(logn)