博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
常用algorithm及其Python实现
阅读量:2225 次
发布时间:2019-05-09

本文共 2995 字,大约阅读时间需要 9 分钟。

冒泡排序

1236395-20180422200312013-921533254.gif

def bubble_sort(li):    for i in range(len(li)-1): # i表示第几趟        for j in range(len(li)-i-1): # j表示图中的箭头            if li[j] > li[j+1]:                li[j], li[j+1] = li[j+1], li[j]============冒泡排序(优化)============def bubble_sort_1(li):    for i in range(len(li)-1): # i表示第几趟        exchange = False        for j in range(len(li)-i-1): # j表示图中的箭头            if li[j] > li[j+1]:                li[j], li[j+1] = li[j+1], li[j]                exchange = True        if not exchange:            return

选择排序

1236395-20180422201032669-1988878696.gif

def select(li):    for i in range(len(li)):        # 第i趟开始时 无序区:li[i:]        # 找无序区最小值,保存最小值的位置        min_index = i        for j in range(i + 1, len(li)):            if li[j] < li[min_index]:                min_index = j        li[min_index], li[i] = li[i], li[min_index]

插入排序

1236395-20180422201045613-1827587901.gif

def insert_sort(li):    for i in range(1, len(li)): # i是摸到的牌的下标        tmp = li[i]     # tmp是摸到牌的值        # 方法一        j = i - 1 # j是手里最后一张牌的下标    li[j]是手里最后一张牌的值        while j >= 0 and li[j] > tmp:   # 两个终止条件:j小于0表示tmp是最小的 顺序不要乱             li[j+1] = li[j]            j -= 1        # 方法二        # for j in range(i-1, -1, -1):        #     if li[j] > tmp:        #         li[j+1] = li[j]        #     else:        #         break        li[j+1] = tmp   #将摸到的牌 插入到 往前挪过之后的 j 的后一位

快速排序

1236395-20180422201059495-1371763769.gif

def part(li, left, right):  # 列表,最左索引,最右索引    tmp = li[left]  # 先找个临时变量把第一个元素存起来    while left < right:  # 当最左小于最右        while left < right and li[right] >= tmp:  # 当最左

堆排序

1236395-20180422201124602-538953339.gif

def sift(li, low, high):    tmp = li[low]    i = low    j = 2 * i + 1    while j <= high: # 退出条件2:当前i位置是叶子结点,j位置超过了high        # j 指向更大的孩子        if j + 1 <= high and li[j+1] > li[j]:            j = j + 1 # 如果右孩子存在并且更大,j指向右孩子        if tmp < li[j]:            li[i] = li[j]            i = j            j = 2 * i + 1        else:       # 退出条件1:tmp的值大于两个孩子的值            break    li[i] = tmp@cal_timedef heap_sort(li):    # 1. 建堆    n = len(li)    for i in range(n//2-1, -1, -1):        # i 是建堆时要调整的子树的根的下标        sift(li, i, n-1)    # 2.挨个出数    for i in range(n-1, -1, -1): #i表示当前的high值 也表示棋子的位置        li[i], li[0] = li[0], li[i]        # 现在堆的范围 0~i-1        sift(li, 0, i-1)

归并排序

1236395-20180422201151503-1725408168.gif

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    # for k in range(low, high+1):    #     li[k] = ltmp[k-low]    li[low:high+1] = ltmpdef 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)# li = list(range(10000))# random.shuffle(li)# merge_sort(li, 0, len(li)-1)# print(li)li = [10,4,6,3,8,2,5,7]merge_sort(li, 0, len(li)-1)

总结

1236395-20180422202039947-241713015.png

参考资料

http://www.cnblogs.com/haiyan123/p/8395926.html

转载于:https://www.cnblogs.com/iyouyue/p/8909217.html

你可能感兴趣的文章
02. 交换机的基本配置和管理
查看>>
03. 交换机的Telnet远程登陆配置
查看>>
微信小程序-调用-腾讯视频-解决方案
查看>>
phpStudy安装yaf扩展
查看>>
密码 加密 加盐 常用操作记录
查看>>
TP 分页后,调用指定页。
查看>>
Oracle数据库中的(+)连接
查看>>
java-oracle中几十个实用的PL/SQL
查看>>
PLSQL常用方法汇总
查看>>
几个基本的 Sql Plus 命令 和 例子
查看>>
PLSQL单行函数和组函数详解
查看>>
Oracle PL/SQL语言初级教程之异常处理
查看>>
Oracle PL/SQL语言初级教程之游标
查看>>
Oracle PL/SQL语言初级教程之操作和控制语言
查看>>
Oracle PL/SQL语言初级教程之过程和函数
查看>>
Oracle PL/SQL语言初级教程之表和视图
查看>>
Oracle PL/SQL语言初级教程之完整性约束
查看>>
PL/SQL学习笔记
查看>>
如何分析SQL语句
查看>>
结构化查询语言(SQL)原理
查看>>