/*归并排序,归并排序依赖于归并操作,归并操作是指将两个已经有序的序列合并成一个有序序列的操作*/
//最坏时间复杂度NlogN,但是需要线性附加内存!!!
算法描述:
1、申请用来存放合并后的序列的空间,大小为两个已经有序序列之和
2、设定两个指针,初始指向两个有序序列的起始位置
3、比较两个指针所指向的元素,将较小的放入到合并空间,并将该指针移到下一个位置
4、重复3直到某一个指针到达尾部
5、将另一序列剩下的元素全部放到合并序列尾部
C++实现,时间复杂度O(nlogn),空间复杂度O(n),稳定
//将两个有序数组合并为一个有序数组
void Merge(int *pData,int *tempArray,int Lpos,int Rpos,int RightEnd)
{
int LeftEnd = Rpos-1, tempPos = Lpos, num = RightEnd-Lpos+1;
while(Lpos<=LeftEnd && Rpos<=RightEnd)
{
if(pData[Lpos]<=pData[Rpos])
tempArray[tempPos++] = pData[Lpos++];
else
tempArray[tempPos++] = pData[Rpos++];
}
while(Lpos<=LeftEnd) //拷贝前半部分剩下的元素
tempArray[tempPos++] = pData[Lpos++];
while(Rpos<=RightEnd) //拷贝后半部分剩下的元素
tempArray[tempPos++] = pData[Rpos++];
for(int i=0;i<num;i++,RightEnd--) //需要考虑中间某一次调用Merge的情况
pData[RightEnd] = tempArray[RightEnd];
}
void MSort(int *pData,int *temp,int left,int right)
{
int center;
if(left<right)
{
center = (left+right)/2;
MSort(pData,temp,left,center); //对前半部分排序
MSort(pData,temp,center+1,right); //对后半部分排序
Merge(pData,temp,left,center+1,right); //合并
}
}
//接口匹配Sort(int *pData, int count)
void MergeSort(int *pData, int count)
{
int *temp = new int[count]; //线性空间开销
MSort(pData,temp,0,count-1);
delete []temp;
}
Python实现
def merge(leftArray,rightArray):
temp=[]
lPos,rPos=0,0
while lPos<len(leftArray) and rPos<len(rightArray):
if leftArray[lPos]<=rightArray[rPos]:
temp.append(leftArray[lPos])
lPos +=1
else:
temp.append(rightArray[rPos])
rPos +=1
temp +=leftArray[lPos:]
temp +=rightArray[rPos:]
return temp
def MergeSort(pData):
if len(pData)<=1:
return pData
center=int(len(pData)/2)
leftArray=MergeSort(pData[:center])
rightArray=MergeSort(pData[center:])
return merge(leftArray,rightArray)