Skip to content

Commit be9e51a

Browse files
committed
归并排序
1 parent 026ee6f commit be9e51a

File tree

1 file changed

+81
-81
lines changed

1 file changed

+81
-81
lines changed

merge_sort.md

Lines changed: 81 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -53,84 +53,84 @@
5353

5454
#解决(Python)
5555

56-
#! /usr/bin/env python
57-
#coding:utf-8
58-
59-
#方法1:将前面讲述的过程翻译过来了,略先拙笨
60-
61-
def merge_sort(seq):
62-
if len(seq) ==1:
63-
return seq
64-
else:
65-
middle = len(seq)/2
66-
left = merge_sort(seq[:middle])
67-
right = merge_sort(seq[middle:])
68-
69-
i = 0 #left 计数
70-
j = 0 #right 计数
71-
k = 0 #总计数
72-
73-
while i < len(left) and j < len(right):
74-
if left[i] < right [j]:
75-
seq[k] = left[i]
76-
i +=1
77-
k +=1
78-
else:
79-
seq[k] = right[j]
80-
j +=1
81-
k +=1
82-
83-
remain = left if i<j else right
84-
r = i if remain ==left else j
85-
86-
while r<len(remain):
87-
seq[k] = remain[r]
88-
r +=1
89-
k +=1
90-
91-
return seq
92-
93-
#方法2:在按照顺序取数值方面,应用了list.pop()方法,代码更紧凑简洁
94-
#此方法来[自维基百科:归并操作](http://zh.wikipedia.org/zh/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F)
95-
96-
def merge_sort(lst): #此方法来自维基百科:http://zh.wikipedia.org/zh/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F
97-
if len(lst) <= 1:
98-
return lst
99-
100-
def merge(left, right):
101-
merged = []
102-
103-
while left and right:
104-
merged.append(left.pop(0) if left[0] <= right[0] else right.pop(0))
105-
106-
while left:
107-
merged.append(left.pop(0))
108-
109-
while right:
110-
merged.append(right.pop(0))
111-
112-
return merged
113-
114-
middle = int(len(lst) / 2)
115-
left = merge_sort(lst[:middle])
116-
right = merge_sort(lst[middle:])
117-
return merge(left, right)
118-
119-
#方法3:原来在python的模块heapq中就提供了归并排序的方法,只要将分解后的结果导入该方法即可
120-
#强大。
121-
#以下方法来自[resettacode](http://rosettacode.org/wiki/Sorting_algorithms/Merge_sort#Python),并稍作修改
122-
123-
from heapq import merge
124-
125-
def merge_sort(seq):
126-
if len(seq) <= 1:
127-
return m
128-
else:
129-
middle = len(seq)/2
130-
left = merge_sort(seq[:middle])
131-
right = merge_sort(seq[middle:])
132-
return list(merge(left, right)) #heapq.merge()
133-
134-
if __name__=="__main__":
135-
seq = [1,3,6,2,4]
136-
print merge_sort(seq)
56+
#! /usr/bin/env python
57+
#coding:utf-8
58+
59+
#方法1:将前面讲述的过程翻译过来了,略先拙笨
60+
61+
def merge_sort(seq):
62+
if len(seq) ==1:
63+
return seq
64+
else:
65+
middle = len(seq)/2
66+
left = merge_sort(seq[:middle])
67+
right = merge_sort(seq[middle:])
68+
69+
i = 0 #left 计数
70+
j = 0 #right 计数
71+
k = 0 #总计数
72+
73+
while i < len(left) and j < len(right):
74+
if left[i] < right [j]:
75+
seq[k] = left[i]
76+
i +=1
77+
k +=1
78+
else:
79+
seq[k] = right[j]
80+
j +=1
81+
k +=1
82+
83+
remain = left if i<j else right
84+
r = i if remain ==left else j
85+
86+
while r<len(remain):
87+
seq[k] = remain[r]
88+
r +=1
89+
k +=1
90+
91+
return seq
92+
93+
#方法2:在按照顺序取数值方面,应用了list.pop()方法,代码更紧凑简洁
94+
#此方法来[自维基百科:归并操作](http://zh.wikipedia.org/zh/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F)
95+
96+
def merge_sort(lst): #此方法来自维基百科:http://zh.wikipedia.org/zh/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F
97+
if len(lst) <= 1:
98+
return lst
99+
100+
def merge(left, right):
101+
merged = []
102+
103+
while left and right:
104+
merged.append(left.pop(0) if left[0] <= right[0] else right.pop(0))
105+
106+
while left:
107+
merged.append(left.pop(0))
108+
109+
while right:
110+
merged.append(right.pop(0))
111+
112+
return merged
113+
114+
middle = int(len(lst) / 2)
115+
left = merge_sort(lst[:middle])
116+
right = merge_sort(lst[middle:])
117+
return merge(left, right)
118+
119+
#方法3:原来在python的模块heapq中就提供了归并排序的方法,只要将分解后的结果导入该方法即可
120+
#强大。
121+
#以下方法来自[resettacode](http://rosettacode.org/wiki/Sorting_algorithms/Merge_sort#Python),并稍作修改
122+
123+
from heapq import merge
124+
125+
def merge_sort(seq):
126+
if len(seq) <= 1:
127+
return m
128+
else:
129+
middle = len(seq)/2
130+
left = merge_sort(seq[:middle])
131+
right = merge_sort(seq[middle:])
132+
return list(merge(left, right)) #heapq.merge()
133+
134+
if __name__=="__main__":
135+
seq = [1,3,6,2,4]
136+
print merge_sort(seq)

0 commit comments

Comments
 (0)