1.sorts method python (9)merge_sort

歸併排序:

原理: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=',')

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章