排序原理:
1、将数组不断拆分,直到个数为1
2、将相邻的两个子组进行合并成一个有序的大组
class Merge:
def __init__(self):
super(Merge, self).__init__()
@staticmethod
def sort(a):
Merge._grouping(a, 0, len(a) - 1)
@staticmethod
def _grouping(a, start, end):
# print(end, start)
if end <= start:
return
mid = int(start + (end - start) / 2)
Merge._grouping(a, start, mid)
Merge._grouping(a, mid + 1, end)
Merge.merge(a, start, mid, end)
@staticmethod
def merge(a, start, mid, end):
# 创建一个辅助数组,初始化和a数组一样的大小
c = [i for i in range(0, len(a))]
index = start
# 第一个子组的起始位置
p1 = start
# 第二个子组的起始位置
p2 = mid + 1
# 知道某一个子组遍历完就退出循环
while (p1 <= mid) and (p2 <= end):
# 判断大小,然后放入辅助数组中,(和原数组相同的索引)
if Merge.compare(a, p1, p2):
c[index] = a[p2]
p2 += 1
index += 1
else:
c[index] = a[p1]
p1 += 1
index += 1
# 遍历没遍历完的部分
while p1 <= mid:
# 放入辅助数组中
c[index] = a[p1]
p1 += 1
index += 1
while p2 <= end:
c[index] = a[p2]
p2 += 1
index += 1
# 将排序完的部分复制回原数组
for i in range(start, end+1):
a[i] = c[i]
@staticmethod
def compare(a, i, j):
if a[i] >= a[j]:
return True
return False
if __name__ == '__main__':
shell = Merge()
t = [1, 3, 2, 4, 0, 6, 5, 8, 7, 123, 1, 25, 3, 123]
shell.sort(t)
print(t)