zoukankan      html  css  js  c++  java
  • 归并排序

    1.1分治算法的概述

    1.分解:把一个问题分解为多个子问题,这些子问题是更小实例上的原问题。
    2.解决:递归求解子问题,当问题足够小时,按照基础情况求解。
    3.合并:把子问题的解合并成原问题的解。

    1.2有序数列的合并

    首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。

    1.3步骤

    1.4程序实现

    class MergeSort:
        def sort(self,li):
         """递归调用""" if len(li)==1: return li mid = len(li)//2 left = li[:mid] right = li[mid:] l1 = self.sort(left) r1 = self.sort(right) return self.merge(l1,r1) def merge(self,array1,array2):
         """合并列表""" new_array = [] while array1!=[] and array2!=[]: n = array1[0] m = array2[0] if n<m: new_array.append(n) array1.remove(n)# array1.pop(0) else: new_array.append(m) array2.remove(m)#array2.pop(0) #print(new_array) if array1 == []: new_array.extend(array2) else: new_array.extend(array1) return new_array if __name__ == "__main__": array = [3,2,5,7,4,6,9] m = MergeSort() m.sort(array) >>>[2, 3, 4, 5, 6, 7, 9]

    时间复杂度: 最好最坏都是 O( n log n )
    稳定性:稳定
    缺点:每次拆分数组都要开辟新的数组, 每次合并数组都要开辟新数组,空间复杂度很大

  • 相关阅读:
    大数据概述
    [转载]Python 资源大全中文版
    dataTaDataTable 详细教程
    DataTable 中文国际化
    ipython notebook教程
    Django查询操作
    Django模型的元数据Meta
    如何使用命令提示符进入mysql
    教你如何查看占用端口
    php简易计算器实例
  • 原文地址:https://www.cnblogs.com/zenan/p/8727269.html
Copyright © 2011-2022 走看看