归并排序
“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。
Merge()函数功能是将前后相邻的两个有序表归并为一个有序表
def merge(li,low,mid,high){
i=low;
j=mid+1;
ltmp=[];
while(i<=mid and j<=high){//只要两边都有数
if(li[i]<li[j])
ltmp.append(li[i]);
else { ltmp.append(li[i]); j+=1;}
}//while执行完,肯定有一部分没数了
while(i<=mid){
ltmp.append(li[i]);
i+=1;
}
while(j<=high){
ltmp.append(li[j]);
j+=1;}
li[low,high+1]=ltmp;
}
一趟归并排序的操作是,调用 n//2h+1 次算法merge(),将L[1…N]中前后相邻且长度为h的有序段两两归并,得到前后相邻,长度为2h的有序段。
递归形式的二路归并排序是基于分治的:
(1)分解:将含有n个元素的待排序表分成含 n/2 个元素的子表,采用2路归并排序算法对两个子表进行排序
(2)合并:合并两个已排序的子表得到排序结果
def merge_sort(li,low,mid,high){
if(low<high){//至少有两个元素,递归
mid=(low+high)//2;
merge_sort(li,low,mid);
merge_sort(li,mid+1,high);
merge(li,low,mid,high);}
}
}
二路归并排序的性能分析:
空间效率:空间复杂度O(n)
时间效率:时间复杂度O(nlogn)
稳定性:稳定