归并排序–Python方式实现
归并排序是一个相对稳定的排序,python排序的底层实践就是使用的归并排序
- 实现代码
"""
dateTime: 2021-05-01 19:40
sort: merge
time: O(nlog2n)
space: O(n)
"""
def merge_sort(array, left, right):
"""
归并排序
核心原理为将数组分成两个有序数组再进行归并
在无法判断数组分为两个后是否有序的情况下
递归式将数组分至只剩一个元素,在依次归并返回
:param array:
:param left:
:param right:
:return: array
"""
if left == right or len(array) == 1:
return array
mid = int(left + (right-left)/2)
left_temp = merge_sort(array[left: mid+1], left, mid) if mid != left else [array[left]]
right_temp = array[mid+1: right+1]
right_temp = merge_sort(right_temp, 0, len(right_temp)-1) if mid+1 != right else [array[right]]
array = left_temp+right_temp
return merge(array, 0, mid+1, right)
def merge(array, left_point, right_point, right_bound):
"""
归并操作
将数组以左右指针的方式分成两个有序数组进行归并
左右指针对比数字,小的放入临时数组,同时指针加一
直到其中一个指针走到尽头
此时将另一边剩余的数字追加到临时数组后,返回
:param array: list()
:param left_point: int()
:param right_point: int()
:param right_bound: int()
:return: array: int()
"""
temp_array = []
mid = right_point - 1
while left_point <= mid and right_point <= right_bound:
if array[left_point] < array[right_point]:
temp_array.append(array[left_point])
left_point += 1
else:
temp_array.append(array[right_point])
right_point += 1
if left_point <= mid:
temp_array = temp_array + array[left_point:mid+1]
if right_point <= right_bound:
temp_array = temp_array + array[right_point:right_bound+1]
array = temp_array
return array
def main():
array = [1, 6, 3, 4, 5, 9, 8, 2, 7]
print(merge_sort(array, 0, len(array)-1))
if __name__ == "__main__":
main()