• 排序算法总结


    排序

    参考资料:经典排序算法总结与实现

    1.快速排序

    def quick_sort(ary):
        return qsort(ary,0,len(ary)-1)
    
    def qsort(ary,left,right):
        #快排函数,ary为待排序数组,left为待排序的左边界,right为右边界
        if left >= right : return ary
        key = ary[left]     #取最左边的为基准数
        lp = left           #左指针
        rp = right          #右指针
        while lp < rp :
            while ary[rp] >= key and lp < rp :
                rp -= 1
            while ary[lp] <= key and lp < rp :
                lp += 1
            ary[lp],ary[rp] = ary[rp],ary[lp]
        ary[left],ary[lp] = ary[lp],ary[left]
        qsort(ary,left,lp-1)
        qsort(ary,rp+1,right)
        return ary
    

    2.归并排序

    def merge_sort(ary):
        if len(ary) <= 1 : return ary
        num = int(len(ary)/2)       #二分分解
        left = merge_sort(ary[:num])
        right = merge_sort(ary[num:])
        return merge(left,right)    #合并数组
    
    def merge(left,right):
        '''合并操作,
        将两个有序数组left[]和right[]合并成一个大的有序数组'''
        l,r = 0,0           #left与right数组的下标指针
        result = []
        while l<len(left) and r<len(right) :
            if left[l] < right[r]:
                result.append(left[l])
                l += 1
            else:
                result.append(right[r])
                r += 1
        result += left[l:]
        result += right[r:]
        return result
    

    3.堆排序

    def heap_sort(ary) :
        n = len(ary)
        first = int(n/2-1)       #最后一个非叶子节点
        for start in range(first,-1,-1) :     #构造大根堆
            max_heapify(ary,start,n-1)
        for end in range(n-1,0,-1):           #堆排,将大根堆转换成有序数组
            ary[end],ary[0] = ary[0],ary[end]
            max_heapify(ary,0,end-1)
        return ary
    
    
    #最大堆调整:将堆的末端子节点作调整,使得子节点永远小于父节点
    #start为当前需要调整最大堆的位置,end为调整边界
    def max_heapify(ary,start,end):
        root = start
        while True :
            child = root*2 +1               #调整节点的子节点
            if child > end : break
            if child+1 <= end and ary[child] < ary[child+1] :
                child = child+1             #取较大的子节点
            if ary[root] < ary[child] :     #较大的子节点成为父节点
                ary[root],ary[child] = ary[child],ary[root]     #交换
                root = child
            else :
                break
    

    排序总结

  • 相关阅读:
    项目中常用的图片处理方案小结
    Unity2D实现人物三连击
    使用mescroll实现上拉加载与下拉刷新
    iOS中文输入法多次触发的问题及解决方案
    使用WebStorm将项目部署到IIS
    在Less中使用条件判断
    Vue+原生App混合开发手记#1
    在Vue中使用layer.js弹出层插件
    局域网简单的SVN服务器的搭建
    在iOS中实现sticky header
  • 原文地址:https://www.cnblogs.com/binwone/p/6041635.html
Copyright © 2020-2023  润新知