归并排序的思想
不断对数组进行划分,每一次的划分都会产生两个子数组,然后将这两个子数组合并。
算法演示
划分
合并
说明
算法的精髓在于不短的划分和合并。当划分到不能再划分的时候,就开始合并。
划分好理解 ,就是将一个数组分为两个数组。
合并就是将两个数组合为一个有序数组。这里有个注意点。合并的时候,两个子数组必然是已经排好序的,因为第一次合并的时候,子数组只有一个元素,后面不断地合并也是合并成一个个有序数组
时间复杂度
我们需要进行 logn次划分,每一次地划分对应一次排序,所以也是logn次排序。
每一次排序将两个有序数组合并成为一有序个数组 时间复杂度为 n
def merge(data,begin,mid,end):
p_left = begin
p_right = mid + 1
temp = []
while p_left <= mid and p_right <= end:
if data[p_left] <= data[p_right] :
temp.append(data[p_left])
p_left += 1
else:
temp.append(data[p_right])
p_right += 1
while p_left <= mid:
temp.append(data[p_left])
p_left += 1
while p_right <= end:
temp.append(data[p_right])
p_right += 1
for i in temp:
data[begin] = i;
begin += 1
复制代码
所以总体时间复杂度为 nlogn
整体算法
"""
归并排序
"""
datas1 = [1, 2, 4, 6, 3, 1, 3, 43, 547, 123, 436, 57, 98, 976, 543, 2112, 378988, 7654321, 32]
def merge(data,begin,mid,end):
p_left = begin
p_right = mid + 1
temp = []
while p_left <= mid and p_right <= end:
if data[p_left] <= data[p_right] :
temp.append(data[p_left])
p_left += 1
else:
temp.append(data[p_right])
p_right += 1
while p_left <= mid:
temp.append(data[p_left])
p_left += 1
while p_right <= end:
temp.append(data[p_right])
p_right += 1
for i in temp:
data[begin] = i;
begin += 1
def mergeSort(data,begin,end):
if begin < end:
mid = (begin + end) // 2
mergeSort(data,begin, mid)
mergeSort(data,mid + 1,end)
merge(data,begin,mid,end)
mergeSort(datas1,0,len(datas1) - 1)
print(datas1)
复制代码