【数据结构&&算法系列】归并排序简单介绍及python代码

来源:互联网 发布:mac 邮件储存位置 编辑:程序博客网 时间:2024/05/21 11:03

归并排序主要采用分治的策略,先对比较小的子序列进行排序,然后对相邻的两个子序列进行合并,依次到对最后剩下的两个子序列进行合并得到最终的排好序的序列。


其中合并两个有序序列的时候可以设置哨兵,哨兵可以减少代码量。对降序排列,哨兵是非常小的数;对升序排序,哨兵是非常大的数。设置哨兵的目的是让所有在哨兵另一边的数参与排序,减少对边界条件的判断。


当然用python语言的时候,merge两个有序序列的时候可以采用下列代码,但为了方便更改为其他语言,最终版本用哨兵的方式进行合并。


注意:

python中用 float("inf")表示正无穷,float("-inf")表示负无穷。

def merge2(arr,p,q,r,reverse=False):arr1 = arr[p:q+1]arr2 = arr[q+1:r+1]k = pwhile arr1 and arr2:if reverse==False:if arr1[0] <= arr2[0]:arr[k] = arr1.pop(0)else:arr[k] = arr2.pop(0)k += 1else:if arr1[0] >= arr2[0]:arr[k] = arr1.pop(0)else:arr[k] = arr2.pop(0)k += 1arr[k:r+1] = arr1 + arr2

代码

#coding:utf-8MAX_MIN = [float("inf"),float("-inf")]def merge(arr,p,q,r,reverse=False):arr1 = arr[p:q+1]arr1.append(MAX_MIN[reverse])arr2 = arr[q+1:r+1]arr2.append(MAX_MIN[reverse])i=j=0for k in range(p,r+1):if reverse==False:if arr1[i] <= arr2[j]:arr[k] = arr1[i]i+=1else:arr[k] = arr2[j]j+=1else:if arr1[i] >= arr2[j]:arr[k] = arr1[i]i+=1else:arr[k] = arr2[j]j+=1def merge_sort(arr, p, r, reverse=False):if p < r:q = (p+r)/2merge_sort(arr, p, q, reverse)merge_sort(arr, q+1, r, reverse)merge(arr, p, q, r, reverse)def show_arr(arr):print "[", ", ".join([str(x) for x in arr]), "]"if __name__ == "__main__":arr1 = [5.2, 2.3, 4.7, 6.9, 1.5, 3.2]merge_sort(arr1, 0, len(arr1)-1)show_arr(arr1)arr2 = [7, 4, 2, 5, 1, 6, 9, 1]merge_sort(arr2, 0, len(arr2)-1, reverse=True)show_arr(arr2)



0 0