按照c代码直接改好像有点问题,而且也不怎么能看懂那个代码,所以自己按着算法原理写了python代码,运行的都正确。(不过也仅仅是参考,不是最优)
算法原理:
归并排序是对有序数列的快速排序方法,基本思想是将序列中两个或多个元素组合成有序子序列,不断归并子序列,从而形成一个有序的序列。
算法步骤:
1. 将n个记录看成是n个长度为1的有序子表
2. 将两两相邻的有序子表进行归并
3. 重复步骤2,直到归并成一个长度为n的有序表
代码:
# -*- coding: utf-8 -*-
"""
Created on Thu Jul 6 14:12:07 2017
归并排序:
归并排序是对有序数列的快速排序方法,基本思想是将序列中两个或多个元素组合
成有序子序列,不断归并子序列
"""
list_data=[]#数据
num_cnt=0#数据的个数
#数据输入
def data_in_func(list_data,num_cnt):
print('请输入数据。')
while 1:
flag=input('输入数据还是退出,输入‘n’退出,其他继续!!!!')
if flag=='n':
return list_data,num_cnt
data=input('请输入数据:')
if data.isdigit():
data=int(data)
list_data.append(data)
num_cnt+=1
else:
print('输入错误请重新输入:')
#归并
def merge(long):
#long此次每个片段的长度
if num_cnt%long==0:#正好分完
for i in range(0,num_cnt,long):#排序次数
for j in range(1,long):#冒泡排序
for k in range(0,long-j):
if list_data[i+k]>list_data[i+k+1]:
list_data[i+k],list_data[i+k+1]=list_data[i+k+1],list_data[i+k]
print(list_data)
else:
remainder=num_cnt%long
num=num_cnt-remainder
for i in range(0,num,long):#排序次数
for j in range(1,long):#冒泡排序
for k in range(0,long-j):
if list_data[i+k]>list_data[i+k+1]:
list_data[i+k],list_data[i+k+1]=list_data[i+k+1],list_data[i+k]
print(list_data)
for j in range(1,remainder):#冒泡排序
for k in range(0,remainder-j):
if list_data[num+k]>list_data[num+k+1]:
list_data[num+k],list_data[num+k+1]=list_data[num+k+1],list_data[num+k]
print(list_data)
#return list_data,num_cnt
def merge_sort(long):
while 1:
merge(long)
long=long*2
if long>2*num_cnt:
break
list_data,num_cnt=data_in_func(list_data,num_cnt)
print(list_data,num_cnt)
merge_sort(2)
print(list_data,num_cnt)
结果:
第一排为输入和输入的个数,最后一排是排好序的列表和个数