归并排序
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
def merge_sort(alist):
n = len(alist)
if n <= 1:
return alist
mid = n // 2
left_li = merge_sort(alist[:mid])
right_li = merge_sort(alist[mid:])
left,right = 0, 0
result = []
while left < len(left_li) and right < len(right_li) :
if left_li[left] <= right_li[right]:
result.append(left_li[left])
left += 1
else:
result.append((right_li[right]))
right += 1
result += left_li[left:]
result += right_li[right:]
return result
if __name__ == '__main__':
li = [1, 3, 4, 2, 9, 5, 8]
print(li)
sort_li = merge_sort(li)
print(sort_li)
思路:
首先将列表通过二分法依次分割,直到分到列表中只含有一个元素
定义一个左列表,一个右列表,一个左游标,一个右游标
左列表与右列表比较,按从小到大的顺序将数据依次加到新定义的空列表中
注意用到递归,函数的执行顺序比较难
时间复杂度:最坏时间复杂度:O(nlogn),最好时间复杂度:O(nlogn)
稳定性:稳定
归并排序是所有排序算法中时间复杂度最小的,但是它返回了一个新的列表,需要开辟新的内存空间
所以在选择究竟用哪种排序算法,需要考虑在时间和空间上,需求哪个优先级更高