归并排序
Posted TheQi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序相关的知识,希望对你有一定的参考价值。
归并排序的思想是将数组分成n个有序的数组
刚开始可以想象把数组分成length个数组,每个数组只有一个元素
那么他们一定是有序的
然后不停的将两个有序的数组进行合并,最后合并成完整的数组
代码如下
void Merge(int arr[],int nLow,int nHigh)
{
int nBegin1;
int nBegin2;
int nEnd1;
int nEnd2;
//再分组
nBegin1 = nLow;
nEnd1 = nLow +(nHigh-nLow)/2;
nBegin2 = nEnd1+1;
nEnd2 = nHigh;
//申请一个辅助数组
int *pTemp = NULL;
pTemp = (int*)malloc(sizeof(int)*(nHigh-nLow+1));
int i;
i = 0;
//将分完的两个有序数组中的元素依次插入到辅助数组中
while(nBegin1 <= nEnd1 && nBegin2 <= nEnd2)
{
if(arr[nBegin1] < arr[nBegin2])
{
pTemp[i] = arr[nBegin1];
i++;
nBegin1++;
}
else
{
pTemp[i] = arr[nBegin2];
i++;
nBegin2++;
}
}
//此时可能会有一个有序数组中有元素
//将其剩余元素插入到辅助数组中
while(nBegin1 <= nEnd1)
{
pTemp[i] = arr[nBegin1];
i++;
nBegin1++;
}
while(nBegin2 <= nEnd2)
{
pTemp[i] = arr[nBegin2];
i++;
nBegin2++;
}
//把辅助数组中的值赋值到原数组中去
for(i = 0;i<nHigh-nLow+1;i++)
{
arr[nLow+i] = pTemp[i];
}
free(pTemp);
pTemp = NULL;
}
void MergeSort(int arr[],int nLow,int nHigh)
{
if(arr == NULL || nLow >= nHigh)return;
int nMid;
nMid = nLow + (nHigh-nLow)/2;
//分组
MergeSort(arr,nLow,nMid);
MergeSort(arr,nMid+1,nHigh);
//合并
Merge(arr,nLow,nHigh);
}
以上是关于归并排序的主要内容,如果未能解决你的问题,请参考以下文章