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)

原文地址:https://www.cnblogs.com/MR-allen/p/10848864.html

时间: 2024-11-11 08:24:04

python常用算法了解的相关文章

Python常用算法

本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间.空间或效率来完成同样的任务.一个算法的优劣可以用空间复杂度与时间复杂度来衡量. 一个算法应该具有以下七个重要的特征: ①有穷性(Fin

python常用算法学习(4)——数据结构

数据结构简介 1,数据结构 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成.简单来说,数据结构就是设计数据以何种方式组织并存贮在计算机中.比如:列表,集合与字典等都是一种数据结构.而之前已经学习过列表,字典,集合,元组等,这里就简单说一下不再赘述. N.Wirth:“程序=数据结构+算法” 数据:数据即信息的载体,是能够输入到计算机中并且能被计算机识别,存储和处理的符号总称. 数据元素:数据元素是数据的基本单位,又称之为记录(Record),一般,数据元

python常用算法(7)——动态规划,回溯法

引言:从斐波那契数列看动态规划 斐波那契数列:Fn = Fn-1 + Fn-2    ( n = 1,2     fib(1) = fib(2) = 1) 练习:使用递归和非递归的方法来求解斐波那契数列的第 n 项 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 # _*_coding:utf-8_*_ def fibnacci(n):     if n == 1

python常用算法(5)——树,二叉树与AVL树

1,树 树是一种非常重要的非线性数据结构,直观的看,它是数据元素(在树中称为节点)按分支关系组织起来的结构,很像自然界中树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示.树在计算机领域中也得到了广泛应用,如在编译源程序时,可用树表示源程序的语法结构.又如在数据库系统中,树型结构也是信息的重要组织形式之一.一切具有层次关系的问题都可以用树来描述. 树(Tree)是元素的集合.树的定义是递归的,树是一种递归的数据结构.比如:目录结构.树是由n个结点组成的集合:如

python常用算法(6)——贪心算法,欧几里得算法

1,贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的的时在某种意义上的局部最优解. 贪心算法并不保证会得到最优解,但是在某些问题上贪心算法的解就是最优解.要会判断一个问题能否用贪心算法来计算.贪心算法和其他算法比较有明显的区别,动态规划每次都是综合所有问题的子问题的解得到当前的最优解(全局最优解),而不是贪心地选择:回溯法是尝试选择一条路,如果选择错了的话可以“反悔”,也就是回过头来重新选择其他的试试. 1.1

Python之路,Day21 - 常用算法学习

Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间.空间或效率来完成同样的任务.一个算法的优劣可以用空间复杂度与时间复杂度来衡量. 一个算

python——常用模块

time.asctime(time.localtime(1234324422)) python--常用模块 1 什么是模块: 模块就是py文件 2 import time #导入时间模块 在Python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的时间字符串: (1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行"type(time.time())",返回的是float类型.

Python常用模块-摘要算法(hashlib)

Python常用模块-摘要算法(hashlib) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MD5算法参数详解 1.十六进制md5算法摘要 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%

python 常用模块 time random os模块 sys模块 json &amp; pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess logging re正则 转自老男孩老师Yuan:http://www.cnblogs.com/yuanchenqi/articles/5732581.html 模块&包(* * * * *) 模块(modue)的概念: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,