1. 分析
/*7. 2路-归并排序(MergeSort)
#时间复杂度: O(nlogn);
空间复杂度:O(n)
#分析:
1. 先分解左边,再分解右边
2. 左右两个分解完毕,直到小组仅有一个元素,返回
3. 返回上一级调用处(此时小组中是有2个元素的)
4. 执行Merge
#特点: 稳定
#实现方法:递归
*/
2. 源码
void Merge(int arr[], int nLow, int nHigh)
{
int nStart1;
int nEnd1;
int nStart2;
int nEnd2;
int i;
int *pTemp = NULL;
pTemp = (int*)malloc(sizeof(int) * (nHigh - nLow +1));
nStart1 = nLow;
nEnd1 = (nLow + nHigh) /2;
nStart2 = nEnd1 +1;
nEnd2 = nHigh;
i = 0;
while(nStart1 <= nEnd1 && nStart2 <= nEnd2)
{
if(arr[nStart1] < arr[nStart2])
{
pTemp[i] = arr[nStart1];
nStart1++;
}
else
{
pTemp[i] = arr[nStart2];
nStart2++;
}
i++;
}
while(nStart1 <= nEnd1)
{
pTemp[i++] = arr[nStart1];
nStart1++;
}
while(nStart2 <= nEnd2)
{
pTemp[i++] = arr[nStart2];
nStart2++;
}
for(i=0; i< nHigh-nLow+1;i++)
{
arr[i + nLow] = pTemp[i];
}
free(pTemp);
pTemp = NULL;
return ;
}
void MergeSort(int arr[], int nLow, int nHigh)
{
if(arr == NULL ||nLow >= nHigh)
return ;
int nMid = (nLow + nHigh)/2;
MergeSort(arr,nLow, nMid);
MergeSort(arr,nMid+1, nHigh);
Merge(arr, nLow, nHigh);
}