zoukankan      html  css  js  c++  java
  • 基本排序算法

    冒泡

    def bubble_sort(li):
        for i in range(len(li)-1):
            exchange = False
            for j in range(len(li)-i-1):
                if li[j] > li[j+1]:
                    li[j], li[j+1] = li[j+1], li[j]
                    exchange = True
            if not exchange:
                return

    插入

    def insert_sort(li):
        for i in range(1, len(li)):
            tmp = li[i]
            j = i-1
            while j >= 0 and li[j] > tmp:
                    li[j+1] = li[j]
                    j -= 1
            li[j+1] = tmp
        return li

    选择

    def select_sort(li):
        for i in range(len(li)-1):
            min_loc = i
            for j in range(i+1, len(li)):
                if li[j] < li[min_loc]:
                    min_loc = j
            if min_loc != i:
                li[i], li[min_loc] = li[min_loc], li[i]
        return li

    def sift(li, low, high):
        i = low
        j = 2*i+1
        tmp = li[i]
        while j <= high:
            if j < high and li[j] < li[j+1]:
                j += 1
            if li[j] > tmp:
                li[i] = li[j]
                i = j
                j = 2*i+1
            else:
                break
        li[i] = tmp
        return li
    
    
    def heap_sort(li):
        n = len(li)
        for i in range(n//2-1, -1, -1):
            sift(li, i, n-1)
        for j in range(n-1, -1, -1):
            li[0], li[j] = li[j], li[0]
            sift(li, 0, j-1)
        return li

    快排

    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
        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)
        return li
    
    
    def quick_sort(li):
        _quick_sort(li, 0, len(li)-1)
        return li

    归并

    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[i])
                i += 1
            else:
                ltmp.append(li[j])
                j += 1
        while i <= mid:
            ltmp.append(li[i])
            i += 1
        while j <= high:
            ltmp.append(li[j])
            j += 1
        li[low:high+1] = ltmp
        return li
    
    
    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)
        return li
    
    
    def merge_sort(li):
        _merge_sort(li, 0, len(li)-1)
        return li

     希尔

    def shell_sort(li):
        d = len(li) // 2
        while d > 0:
            for i in range(d, len(li)):
                tmp = li[i]
                j = i - d
                while j >= 0 and li[j] > tmp:
                    li[j+d] = li[j]
                    j -= d
                li[j+d] = tmp
            d //= 2

    计数

    def count_sort(li, max_num):
        count = [0 for _ in range(max_num)]
        for num in li:
            count[num] += 1
        i = 0
        for k, v in enumerate(count):
            for j in range(v):
                li[i] = k
                i += 1

    def bucket_sort(li, n=100, max_num=1000):
        buckets = [[] for _ in range(n)]
        for num in li:
            i = min(num//max_num//n, n-1)
            buckets[i].append(num)
            for j in range(len(buckets[i])-1, 0, -1):
                if buckets[i][j] < buckets[i][j-1]:
                    buckets[i][j-1], buckets[i][j] = buckets[i][j], buckets[i][j-1]
                else:
                    break
        li.clear()
        for buc in buckets:
            li.extend(buc)

    基数排序

    def radix_sort(li):
        max_num = max(li)
        ini = 0
        while 10 ** ini <= max_num:
            buckets = [[] for _ in range(10)]
            for num in li:
                digit = (num // 10 ** ini) % 10
                buckets[digit].append(num)
            li.clear()
            for buc in buckets:
                li.extend(buc)
            ini += 1
  • 相关阅读:
    【数论】线性模方程
    【数论】拓展欧几里得
    BZOJ1433: [ZJOI2009]假期的宿舍
    BZOJ2823: [AHOI2012]信号塔
    BZOJ1088: [SCOI2005]扫雷Mine
    BZOJ1257: [CQOI2007]余数之和sum
    BZOJ1227: [SDOI2009]虔诚的墓主人
    BZOJ1856: [Scoi2010]字符串
    BZOJ1084: [SCOI2005]最大子矩阵
    BZOJ2007: [Noi2010]海拔
  • 原文地址:https://www.cnblogs.com/lamb2018/p/11165053.html
Copyright © 2011-2022 走看看