zoukankan      html  css  js  c++  java
  • python常用算法了解

    这里从个人角度,总结下python常用算法,不罗嗦,直接看代码(文字解释及推到过程网上有很多,大家可以通过度娘了解)

    以下排名仅从写代码人自己习惯的顺序!

    NO.1 二分查找

    import time
    
    # 时间装饰器
    def cal_time(func):
        def wrapper(*args, **kwargs):
            start_time = time.time()
            result = func(*args, **kwargs)
            end_time = time.time()
            # print("%s running time: %s secs." % (func.__name__, start_time - end_time))
            print("%s 函数执行时间是: %s 秒" % (func.__name__, start_time - end_time))
            return result
    
        return wrapper
    
    
    @cal_time
    def bin_search(data_list, val):
        # 开始位置:第0个位置
        low = 0
        # 结束位置:最后一个位置
        high = len(data_list) - 1
        # 循环判断
        while low <= high:
            # 获取中间位置,这里需要整除//
            mid = (low + high) // 2
            # 判断中间索引对应的数字是不是查找的数字
            if data_list[mid] == val:
                #print(data_list[mid])
                return mid
            # 如果中间索引对应的数字在查找数字的左边,则 low = mid + 1
            elif data_list[mid] < val:
                low = mid + 1
            # 如果中间索引对应的数字在查找数字的右边,则  high = mid - 1
            elif data_list[mid] > val:
                high = mid - 1
        return
    
    
    if __name__ == '__main__':
        data_list = list(range(1,10000))
        ret = bin_search(data_list, 6666)
        print(ret)

    NO.2 冒泡

    import random
    
    def buble_sort1(data_list):
        # i 是已经执行的趟数 i=n-1 ,n是列表中数字总个数=len(data_list)
        for i in range(len(data_list) - 1):
            # j是等待执行的趟数
            for j in range(len(data_list) - 1 - i):
                if data_list[j] > data_list[j + 1]:
                    data_list[j], data_list[j + 1] = data_list[j + 1], data_list[j]
    
    #优化版本
    #如果排了一半,后面数据不需要排序的情况
    def buble_sort2(data_list):
        # i 是已经执行的趟数 i=n-1 ,n是列表中数字总个数=len(data_list)
        for i in range(len(data_list) - 1):
            exchange = False
            # j是等待执行的趟数
            for j in range(len(data_list) - 1 - i):
                if data_list[j] > data_list[j + 1]:
                    data_list[j], data_list[j + 1] = data_list[j + 1], data_list[j]
                    #如果进行交换,则修改变量
                    exchange = True
            #如果没发生交换
            if not exchange:    #exchange = False
                break
    
    if __name__ == '__main__':
        data_list = list(range(1001))
        # 打乱数字顺序
        random.shuffle(data_list)
        # print(data_list)
        buble_sort2(data_list)
        print(data_list)

    NO.3 快排

    import random
    
    
    def quick_sort_x(data, left, right):
        #判断left right,如果相等,就结束函数
        if left < right:
            #mid是tmp的索引位置
            mid = partition(data, left, right)
            #左边递归
            quick_sort_x(data, left, mid - 1)
            #右边递归
            quick_sort_x(data, mid + 1, right)
    
    def partition(data, left, right):
        #把data[left]赋值给了tmp,所以现在left的位置是空的
        tmp = data[left]
        # 判断left right,如果相等,就结束函数
        while left < right:
            #先从右边开始找
            #右边寻找的是比tmp小的数,所以,如果找到比tmp大的数,进行循环
            while left < right and data[right] >= tmp:
                right -= 1
            # 把右边找到的数赋值给左边,右边出现了空位置
            # 现在指针现在到了左边
            data[left] = data[right]
            # 左边寻找的是比tmp大的数,所以,如果找到比tmp小的数,进行循环
            while left < right and data[left] <= tmp:
                left += 1
            # 把左边找到的数赋值给右边,左边出现了空位置
            # 现在指针现在到了右边
            data[right] = data[left]
        #把tmp赋值给左边空出的位置
        data[left] = tmp
        # 返回tmp的下角标(索引)
        return left
    
    
    if __name__ == '__main__':
        data = list(range(1000))
        random.shuffle(data)
        print('排序前:',data)
        quick_sort_x(data,0,len(data)-1)
        print('排序后:',data)

    NO.4 插入排序

    import random
    
    
    def insert_sort(data_list):
        for i in range(1, len(data_list)):
            temp = data_list[i]
            j = i - 1
            while j >= 0 and data_list[j] > temp:
                data_list[j + 1] = data_list[j]
                # 少了一个数
                j = j - 1
            data_list[j + 1] = temp
    
    
    if __name__ == '__main__':
        data_list = list(range(1001))
        # 打乱数字顺序
        random.shuffle(data_list)
        # print(data_list)
        insert_sort(data_list)
        print(data_list)

    NO.5 选择排序

    import random
    
    
    def select_sort(data_list):
        for i in range(len(data_list) - 1):
            # 假设第i个索引对应的值最小
            min_index = i
            # 第i个索引对应的值 和 从第i+1个索引开始的数进行循环比较
            for j in range(i + 1, len(data_list)):
                if data_list[min_index] > data_list[j]:
                    min_index = j
            # 注意:这时 data_list[min_index] = data_list[j]
            data_list[i], data_list[min_index] = data_list[min_index], data_list[i]
    
    
    if __name__ == '__main__':
        data_list = list(range(1001))
        # 打乱数字顺序
        random.shuffle(data_list)
        select_sort(data_list)
        print(data_list)

    NO.6 堆排序

    import random
    
    def sift(data,low,high):
        i = low
        j = 2 * i + 1
        tmp = data[i]
        while j <= high:
            #if j < high and data[j] < data[j + 1]:
            if j < high and data[j] > data[j + 1]:
                j = j + 1
            #if tmp < data[j]:
            if tmp > data[j]:
                data[i] = data[j]
                i = j
                j = 2 * i + 1
            else:
                break
        data[i] = tmp
    
    
    def heap_sort(data):
        n = len(data)  # 把堆的长度存一下
    
        # 建堆:
        # 从最后一个有孩子的父亲开始,直到第一个领导【(n // 2 - 1,-1)--->范围,最后一个 -1是步长】
        # 实验证明:最后一个有孩子的父亲的位置是n // 2 - 1
        for i in range(n // 2 - 1, -1,-1):
    
        # 每次调整这个领导('i')所在的堆【每个小堆做调整】,调整到堆的最后,所以 high = n-1
        # 堆就建好了
            sift(data, i, n - 1)
    
        # 挨个出数:
        for i in range(n - 1, -1):
            # i 是堆的最后一个元素
            # 领导退休,平民上位
            data[0], data[i] = data[i], data[0]
            # 调整出新领导
            sift(data, 0, i - 1)
    
    
    if __name__ == '__main__':
        data = list(range(1000))
        random.shuffle(data)
        print('排序前:',data)
        heap_sort(data)
        print('排序后:',data)
  • 相关阅读:
    Git for Android Studio 学习笔记
    ACM-线段树区间更新+离散化
    hdu 1394 逆序数(线段树)
    Android瀑布流照片
    Android照片墙-多图加载
    Android-加载图片避免OOM
    Android-自定义View实现ImageView播放gif
    maven---工程建立及目录添加--
    oracle--视图(2)---
    Hibernate---Hql查询2---
  • 原文地址:https://www.cnblogs.com/MR-allen/p/10848864.html
Copyright © 2011-2022 走看看