zoukankan      html  css  js  c++  java
  • 列表排序之NB三人组附加一个希尔排序

    NB三人组之 快速排序

    def partition(li, left, right):
        tmp = li[left]
        while left < right:
            while left < right and li[right] >= tmp:
                right -= 1
            li[left] = li[right]
            while left < right and li[left] <= tmp:
                left += 1
            li[right] = li[left]
        li[left] = tmp  # 当left和right都指向同一个角标时
        return left
    
    
    def _quick_sort(li, left, right):
        if left < right:
            mid = partition(li, left, right)
            _quick_sort(li, left, mid-1)
            _quick_sort(li, mid+1, right)
    
    def quick_sort(li):
        _quick_sort(li, 0, len(li)-1)
    quick_sort

    NB三人组之 堆排序

    def sift(li, low, high):
        i = low
        j = 2*i + 1
        tmp = li[low]
        while j <= high:
            if j + 1 <= high and li[j] < li[j+1]:
            # j<=high表示如果有两个分支  如果左边孩子小于右边孩子那么交换
                j = j+1
            if tmp < li[j]:
                li[i] = li[j]
                i = j
                j = i*2 + 1
            else:
                break
        li[i] = tmp
    
    
    def heap_sort(li):
        n = len(li)
        for i in range(n//2-1, -1, -1):
            sift(li, i, n-1)
         # 开始出数
        for i in range(n-1, -1, -1):
            li[i], li[0] = li[0], li[i]
            # 现在堆的范围是0 ~ i-1 i的位置用来存放出数的值
            sift(li, 0, i-1)
    heap_sort

    NB三人组之 归并排序

     

    def merge(li, low, mid, high):
        i = low
        j = mid + 1
        ltmp = []
        while i <= mid and j <= high:
            if li[i] > li[j]:
                ltmp.append(li[j])
                j += 1
            else:
                ltmp.append(li[i])
                i += 1
        while i <= mid:
            ltmp.append(li[i])
            i += 1
        while j <= high:
            ltmp.append(li[j])
            j += 1
        li[low:high+1] = ltmp
    
    
    def merge_sort(li, low, high):
        if low < high:
            mid = (low + high) // 2
            merge_sort(li, low, mid)
            merge_sort(li, mid+1, high)
            merge(li, low, mid, high)
    merge_sort

     附加之 希尔排序(插入排序的变种)

    def insert_sort_gap(li, gap):
        for i in range(1, len(li)): # i是摸到的牌的下标
            tmp = li[i]
            j = i - gap # j是手里最后一张牌的下标
            while j >= 0 and li[j] > tmp:   # 两个终止条件:j小于0表示tmp是最小的 顺序不要乱
                li[j+gap] = li[j]
                j -= gap
            li[j+gap] = tmp
    
    @cal_time
    def shell_sort(li):
        d = len(li) // 2
        while d > 0:
            insert_sort_gap(li, d)
            d = d // 2

  • 相关阅读:
    vc++ 最小化到托盘的详细实现
    WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解(转载)
    windows 进程间通讯方法
    C++中各种数据量类型转换
    WTL 自绘 进度条Progressbar
    C++ 读取XML文件(tinyXML库的应用)
    WTL 自定义 Button类-自绘
    设计模式课程 设计模式精讲 27-3 状态模式源码解析
    设计模式课程 设计模式精讲 27-2 状态模式coding
    设计模式课程 设计模式精讲 26-3 访问者模式源码解析
  • 原文地址:https://www.cnblogs.com/Stay-J/p/8977234.html
Copyright © 2011-2022 走看看