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

    首先归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。然后再将她们按照两个有序数组的样子合并起来。

    两个有序数组排序的方法则非常简单,同时对两个数组的第一个位置进行比大小,将小的放入一个空数组,然后被放入空数组的那个位置的指针往后 移一个,然后继续和另外一个数组的上一个位置进行比较,以此类推。到最后任何一个数组先出栈完,就将另外i一个数组里的所有元素追加到新数组后面。

    由于递归拆分的时间复杂度是logN 然而,进行两个有序数组排序的方法复杂度是N该算法的时间复杂度是N*logN 所以是NlogN。

    def merge(list1, list2):
        tmp = []
        i = 0
        j = 0
        while i < len(list1) and j < len(list2):
            if list1[i] < list2[j]:
                tmp.append(list1[i])
                i += 1
            else:
                tmp.append(list2[j])
                j += 1
    
        if i == len(list1):
            for t in list2[j:]:
                tmp.append(t)
        else:
            for t in list1[i:]:
                tmp.append(t)
        return tmp
    
    def merge_sort(list):
        if len(list) < 2:
            return list
        mid = int(len(list) / 2)
        left = merge_sort(list[:mid])
        right = merge_sort(list[mid:])
        return merge(left, right)
    
    
    
    if __name__ == '__main__':
        list = [32, 13, 28, 5, 23, 56, 12, 78, 34, 1, 67, 4]
        result = merge_sort(list)
        print(result)
    
  • 相关阅读:
    Swift,数组
    Android-Binder(一)
    Android 前台服务
    Android-Service和Thread
    Android-认识Service
    Android-属性动画
    Android-Activity的切换效果
    Android-LayoutAnimation
    django模板解析 循环列表中 切片和求长度
    ubuntu16 安装cron 以及使用
  • 原文地址:https://www.cnblogs.com/fredkeke/p/9453889.html
Copyright © 2011-2022 走看看