7.5 归并排序
归并排序主要是二路归并排序。二路归并排序的基本思想是:将两个有序表合并为一个有序表。
假设顺序表中n个记录为n个长度为1的有序表,从第1个有序表开始,把相邻的两个有序表两两合并成一个有序表,得到n/2个长度为2的有序表。如此重复,最后得到一个长度为n的有序表。
Python Codes:
def __Merge(arr,start1,start2,end):
while(start1<=end and start2<=end):
if(arr[start1]>arr[start2] and start1<start2):
val=arr[start2]
for i in range(start2,start1,-1):
arr[i]=arr[i-1]
arr[start1]=val
start2+=1
else:
start1+=1
def MergeSort(arr):
i=1
while(i<len(arr)):
for j in range(0,len(arr),2*i):
start1=j
start2=j+i
end=j+2*i-1
if end>=len(arr):
end=len(arr)-1
if start2<len(arr):
__Merge(arr,start1,start2,end)
i=2*i
C++ Codes:
template<class T>
void Merge(T vec[],int length,int start1,int start2,int end)
{
while(start1<start2&&start2<=end)
{
if(vec[start1]>vec[start2])
{
T val=vec[start2];
for(int i=start2;i>start1;--i)
{
vec[i]=vec[i-1];
}
vec[start1]=val;
++start2;
}
else
++start1;
}
}
template<class T>
void MergeSort(T vec[],int length)
{
int i=1;
while(i<length)
{
for(int j=0;j<length;j+=2*i)
{
int start1=j;
int start2=i+j;
int end=j+i*2-1;
if(end>=length)
{
end=length-1;
}
if(start2<length)
{
Merge(vec,length,start1,start2,end);
}
}
i*=2;
}
}
![](http://hi.csdn.net/attachment/201202/7/0_1328597518oLcO.gif)
二路归并排序的时间复杂度为O(nlog2 n).