冒泡排序

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

选择排序

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]

插入排序

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 的后一位

快速排序

def part(li, left, right):  # 列表,最左索引,最右索引
   tmp = li[left]  # 先找个临时变量把第一个元素存起来
   while left < right:  # 当最左小于最右
       while left < right and li[right] >= tmp:  # 当最左<最右 且 最右边的值大于等于临时变量
           right -= 1  # 最右 往左 挪 1 个单位长度
       li[left] = li[right]  # 都不满足:把挪完之后的最右的值 赋值给 最左的值(即最右的值小于临时变量时,这个值挪到当前最左的值)
       while left < right and li[left] <= tmp:  # 当最左<最右 且 最左边的值小于等于临时变量
           left += 1  # 最左 往右 挪 1 个单位长度
       li[right] = li[left]  # 都不满足:把挪完之后的最左的值 赋值给 最右的值(即最左的值大于临时变量时,这个值挪到当前最右的值)
   li[left] = tmp  # 当前最左最右的值相等时,把这个值赋给临时变量
   return left  # 返回当前临时变量的索引

def quick(li, left, right):
   if left < right:  # 如果左索引<右索引
       mid = part(li, left, right)  # 调用part进行分区 返回一个索引赋给mid
       quick(li, left, mid - 1)  # 递归调用quick 直到left=mid-1
       quick(li, mid + 1, right)  # 递归调用quick 直到mid+1=right

li = list(range(1000))
import random
random.shuffle(li)
print(li)

quick(li, 0, len(li) - 1)
print(li)

堆排序

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_time
def 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)

归并排序

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] = 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)

# 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)

总结


识别图中二维码,领取python全套视频资料

常用算法及其Python实现的更多相关文章

  1. 常用算法的python实现

    1.乘法表 #! -*- coding:utf-8 -*- for i in range(1,10): for j in range(1,i+1): print('%d*%d=%d\t' % (i, ...

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

    Python之路,Day21 - 常用算法学习   本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...

  3. 常用排序算法的python实现和性能分析

    常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...

  4. python 下的数据结构与算法---2:大O符号与常用算法和数据结构的复杂度速查表

    目录: 一:大O记法 二:各函数高阶比较 三:常用算法和数据结构的复杂度速查表 四:常见的logn是怎么来的 一:大O记法 算法复杂度记法有很多种,其中最常用的就是Big O notation(大O记 ...

  5. 第四百一十四节,python常用算法学习

    本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机 ...

  6. Python常用算法

    本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机 ...

  7. 八大排序算法的 Python 实现

    转载: 八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个 ...

  8. 机器学习算法与Python实践之(四)支持向量机(SVM)实现

    机器学习算法与Python实践之(四)支持向量机(SVM)实现 机器学习算法与Python实践之(四)支持向量机(SVM)实现 zouxy09@qq.com http://blog.csdn.net/ ...

  9. 机器学习算法与Python实践之(三)支持向量机(SVM)进阶

    机器学习算法与Python实践之(三)支持向量机(SVM)进阶 机器学习算法与Python实践之(三)支持向量机(SVM)进阶 zouxy09@qq.com http://blog.csdn.net/ ...

随机推荐

  1. Sonatype Nexus

    Maven 常用的仓库管理http://zh.wikipedia.org/wiki/Apache_Maven

  2. tcp/ip ---数据封装过程

  3. rac_安装软件时报版本号过高问题

    原创作品,出自 "深蓝的blog" 博客.欢迎转载,转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...

  4. 自己开发前端调试工具:Gungnir

    文章目录 1. 界面介绍 2. 项目资源管理界面 3. 文本编辑器功能 4. 代理功能 4.1. 自动下载线上文件 4.2. 使用本地已有文件 4.3. 代理整个目录 4.4. 执行文件内容后返回结果 ...

  5. Atitit  atiMail atiDns新特性 v2  q39

    Atitit  atiMail atiDns新特性 v2  q39 V1  实现了基础的功能 V2  重构..使用自然语言的方式 c.According_to_the_domain_name(&quo ...

  6. 获取CPU个数

    PROCESSER=`grep 'processor' /proc/cpuinfo | wc -l` JOBSS=$[$PROCESSER*2]

  7. .net站内搜索

    蜘蛛,spider 爬网站.爬网站的过程:1.发现网站.百度把csdn当成关键网站,顺着已知的网站链接找到新的网站或者新的页面.SEO(搜索引擎优化)的第一个手段:建外链(外部链接).新网站吸引蜘蛛. ...

  8. Xcode7中你一定要知道的炸裂调试神技【转载】

    Xcode7中苹果为我们增加了两个重要的debug相关功能.了解之后觉得非常实用,介绍给大家. 1.Address Sanitizer: 妈妈再也不用担心 EXC_BAD_ACCESS EXC_BAD ...

  9. erlang 洗牌 shuffle

    很简单的一个场景:一副扑克(54张)的乱序洗牌 shuffle_list(List) -> [X || {_, X} <- lists:sort([{random:uniform(), N ...

  10. 面向Internet的编程

    面向Internet的编程 1994年秋天我返回工作时,这个公司的景象已经完全改变.他们决定Oak语言——跨平台的.安全的.易传输的代码——时理想的面向Internet的语言.同时他们在制作名为Web ...