归并排序
1. 一次归并
假设现在的列表分两段有序, 如何将其合成为一个有序列表
选取两段列表,分成两段,然后一一比较
比较完成,这便是一次归并
2. 一次归并算法实现
def merge(li, low, mid, high):
i = low
j = mid + 1
li_tmp = []
while i <= mid and j <= high:
if li[i] <= li[j]:
li_tmp.append(li[i])
i += 1
if li[i] >= li[j]:
li_tmp.append(li[j])
j += 1
while i <= mid:
li_tmp.append(li[i])
i += 1
while j <= high:
li_tmp.append(li[j])
j += 1
for i in range(low, high+1):
li[i] = li_tmp[i-low]
例题:已知两个有序列表,实现将这两个列表合并排序
代码实现
def merge_sort(li1, li2):
i = 0
j = 0
li = []
while i < len(li1) and j < len(li2):
if li[i] >= li[j]:
li.append(li[j])
j += 1
else:
li.append(li[i])
i += 1
while i < len(li1):
li.append(li[i])
i += 1
while j < len(li2):
li.append(li[j])
j += 1
归并排序算法实现
def merge_sort(li, low, high):
if low < high:
mid = (low + high) // 2
merge_sort(li, low , mid)
merge_sort(li, mid + 1, high)
merge(li, low, mid, high)
def merge(li, low, mid, high):
i = low
j = mid + 1
li_tmp = []
while i <= mid and j <= high:
if li[i] <= li[j]:
li_tmp.append(li[i])
i += 1
if li[i] >= li[j]:
li_tmp.append(li[j])
j += 1
while i <= mid:
li_tmp.append(li[i])
i += 1
while j <= high:
li_tmp.append(li[j])
j += 1
for i in range(low, high+1):
li[i] = li_tmp[i-low]