歸併排序:
原理:https://www.cnblogs.com/chengxiao/p/6194356.html
這應該是我寫的最蠢的一個代碼了,不,可能以後還能寫出更蠢的。。。。冗長,只能實現2**n 次方數組排序。。。準備接受鄙視了...
# -*- coding: utf-8 -*-
"""
Created on Wed Jul 31 10:14:28 2019
@author: yue zhang
E-mails: [email protected]
"""
import numpy as np
def merge(data1,data2):
print(data1)
print(data2)
length1 = len(data1)
length2 = len(data2)
result = []
i=0
j=0
while i <length1 and j<length2:
if data1[i]>data2[j]:
result.append(data2[j])
j=j+1
else:
result.append(data1[i])
i=i+1
while i<length1:
result.append(data1[i])
i=i+1
while j<length2:
result.append(data2[j])
j=j+1
print(np.array(result))
return np.array(result)
def MergeSort(target):
length = len(target)
inter = int(np.log2(length))
print(inter,length)
for i in range (inter):
j=1
gap = 2**(i+1)-1
while j*(gap+1)<=length:
temp = int((gap+1)/2)
data[j*(gap+1)-1-gap:(j+1)*(gap+1)-1-gap] = merge(data[j*(gap+1)-1-gap:j*(gap+1)-temp],data[j*(gap+1)-temp:(j+1)*(gap+1)-1-gap])
j=j+1
return data
if __name__ == '__main__':
data = [10,20, 50,3, 5,7, 9,11, 88,55, 77,56, 1,2,4,555,19, 25, 26, 29 ,38 ,50 ,80, 91 ,86, 78 ,66 ,46, 32 ,19 ,15 , 7]
aa = MergeSort(data)
標準答案附上:https://github.com/TheAlgorithms/Python/blob/master/sorts/merge_sort.py
"""
This is a pure python implementation of the merge sort algorithm
For doctests run following command:
python -m doctest -v merge_sort.py
or
python3 -m doctest -v merge_sort.py
For manual testing run:
python merge_sort.py
"""
def merge_sort(collection):
"""Pure implementation of the merge sort algorithm in Python
:param collection: some mutable ordered collection with heterogeneous
comparable items inside
:return: the same collection ordered by ascending
Examples:
>>> merge_sort([0, 5, 3, 2, 2])
[0, 2, 2, 3, 5]
>>> merge_sort([])
[]
>>> merge_sort([-2, -5, -45])
[-45, -5, -2]
"""
def merge(left, right):
'''merge left and right
:param left: left collection
:param right: right collection
:return: merge result
'''
result = []
while left and right:
result.append((left if left[0] <= right[0] else right).pop(0))
return result + left + right
if len(collection) <= 1:
return collection
mid = len(collection) // 2
return merge(merge_sort(collection[:mid]), merge_sort(collection[mid:]))
if __name__ == '__main__':
user_input = input('Enter numbers separated by a comma:\n').strip()
unsorted = [int(item) for item in user_input.split(',')]
print(*merge_sort(unsorted), sep=',')
另一版本:https://github.com/TheAlgorithms/Python/blob/master/sorts/merge_sort_fastest.py
'''
Python implementation of the fastest merge sort algorithm.
Takes an average of 0.6 microseconds to sort a list of length 1000 items.
Best Case Scenario : O(n)
Worst Case Scenario : O(n^2) because native python functions:min, max and remove are already O(n)
'''
def merge_sort(collection):
"""Pure implementation of the fastest merge sort algorithm in Python
:param collection: some mutable ordered collection with heterogeneous
comparable items inside
:return: a collection ordered by ascending
Examples:
>>> merge_sort([0, 5, 3, 2, 2])
[0, 2, 2, 3, 5]
>>> merge_sort([])
[]
>>> merge_sort([-2, -5, -45])
[-45, -5, -2]
"""
start, end = [], []
while len(collection) > 1:
min_one, max_one = min(collection), max(collection)
start.append(min_one)
end.append(max_one)
collection.remove(min_one)
collection.remove(max_one)
end.reverse()
return start + collection + end
if __name__ == '__main__':
user_input = input('Enter numbers separated by a comma:\n').strip()
unsorted = [int(item) for item in user_input.split(',')]
print(*merge_sort(unsorted), sep=',')