快排:最优复杂度 O(n*logn) 最坏时间复杂度O(n^2)平均时间复杂度n^(1.3)

归并排序:最优/平均/最坏  时间复杂度均O(nlogn),但是内存占用为list大小的两倍,算法稳定

############################## p5  排序 ###################################
def bubble_sort(alist):"""顺序表实现bubble"""n=len(alist)for j in range(0,n-1):#遍历次数,没遍历一次 遍历长度-1 遍历j次 -jcount = 0for i in range(0,n-1-j):#一次循环找到最大值,并且移动到最后位置  主体if alist[i]>alist[i+1]:alist[i],alist[i+1]=alist[i+1],alist[i]count+=1if 0 == count:return #####count 优化  不交换数字 不增加计数def choose_sort(alist):"""选择排序:找到最小的数字,放到最前面"""min = 0n = len(alist)for j in range(0,n-2):min = jfor i in range(j+1,n):if alist[min]>alist[i]:min = ialist[j],alist[min] = alist[min],alist[j]def insert_sort(alist):"""插入排序,从右边去除一个数 ,房子啊最左边 在最左边排序,不断地从右边获取后面的数字"""n = len(alist)#从右边的无序序列中取出多少个元素执行这样的过程for j in range(1,n):#内层循环的起始值i = j#执行从右边的无序序列中去除第一个元素,即i位置的元素,插入到正确的位置while(i>0): #for i in range(i,0,-1)if alist[i] < alist[i-1]:alist[i], alist[i-1] = alist[i-1], alist[i]i -= 1else:breakdef shell_sort(alist):""""希尔排序 不稳定 O(n^2) 分而治之 p5.7 -p5.8"""n = len(alist)gap = n//2  # python取整 双斜线while gap >= 1:#该循环将gap 变换到1 之前#插入算法与普通插入算法一样for j in range(gap,n):#j = [gap,gap+1,gap+2,.....,n ]i = jwhile(i>0):   ###除了间隔 gap 和插入算法一摸一样if alist[i] < alist[i-gap]:#alist[i],alist[i-gap] = alist[i-gap],alist[i]i -= gapelse:breakgap //= 2def quick_sort(alist, first, last):""""#快速排序  递归嵌套 最优时间复杂度nlgn"""if first >= last:returnlow = firsthigh = lastmid_value = alist[first]while low < high:while low < high and alist[high] >= mid_value: #high左移high -= 1alist[low] = alist[high]while low < high and alist[low] < mid_value:  # low右移low += 1alist[high] = alist[low]# 从循环退出时  low = highalist[low] = mid_valuequick_sort(alist,first,low-1)  #对low左边的列表执行快排quick_sort(alist,low+1,last)   #对low右边的列表执行快排def merge_sort(alist):"""有额外开销 需要两倍的存储空间"""n = len(alist)if n<= 1:return alistmid = n//2###拆分的过程部分代码left_li = merge_sort(alist[:mid])right_li = merge_sort(alist[mid:])## 合并的部分代码 merge(left,right)left_pointer, right_pointer = 0, 0result = []## 调整内部顺序while left_pointer < len(left_li) and right_pointer < len(right_li):if left_li[left_pointer] <= right_li[right_pointer]:result.append(left_li[left_pointer])left_pointer += 1else:result.append(right_li[right_pointer])right_pointer += 1#####合并切片result += left_li[left_pointer:]result += right_li[right_pointer:]return resultif __name__ == "__main__":li = [54, 26, 2, 4, 5, 100, 102]print(li)# quick_sort(li, 0, len(li)-1)result_li = merge_sort(li)print(result_li)"""merge_sort=[54, 26, 2, 4, 5, 100, 102]left_li = [54, 26, 2, 4]  right_li=left_li = [54, 26]  right_li = [2, 4] left_li = [54]  right_li = [26]左边一半完成分割,开始进行排序操作执行 if n<= 1: list长度为1 ,返回自身  left_li = [54] right_li = merge_sort(alist[mid:]) = merge_sort(【54,26】[mid=1:])=[26]right_li = [26][54,26] 进行主循环   返回[2,4] 开始 执行 ## 调整内部顺序"""

python数据结构与算法:排序算法(面试经验总结)相关推荐

  1. Java数据结构第一讲-排序算法

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  2. 一篇夯实一个知识点系列--python实现十大排序算法

    写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 很多人学习python,不知 ...

  3. 排序算法python实现_合并排序算法– Java,C和Python实现

    排序算法python实现 Merge sort is one of the most efficient sorting algorithms. It works on the principle o ...

  4. [ 数据结构 -- 手撕排序算法第三篇 ] 希尔排序

    手撕排序算法系列之:希尔排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算法:排序算 ...

  5. 数据结构十大排序算法(python)

    十大经典排序算法 (java实现看这个)https://program.blog.csdn.net/article/details/83785159 名词解释: 1.冒泡排序 2.选择排序 3.插入排 ...

  6. python算法描述_数据结构(Python语言描述)- 排序算法

    目录 1.基本排序算法 1.1 选择排序 1.2 冒泡排序 1.3 插入排序 2. 更快排序算法 2.1 快速排序 2.2 归并排序(合并排序) 1.基本排序算法 计算机科学家设计了很多巧妙的策略对列 ...

  7. python算法与数据结构:08排序算法

    稳定性定义:相同的值在排序结束之后的相对次序不变. 1. 冒泡排序 每一轮相邻两个值之间比较,大小顺序相反的交换位置,最后的值总是最大. 稳定性:稳定 def BubbleSort(alist):&q ...

  8. 数据结构与算法--5.Python实现十大排序算法

    文章目录 0. 相关概念 一. 冒泡排序 二. 选择排序 三. 插入排序 四. 希尔排序 五. 快速排序 六. 归并排序 七. 其他 0. 相关概念 稳定:如果a原本在b前面,而a=b,排序之后a仍然 ...

  9. python 十大经典排序算法

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算法有:插入排序.希尔排序.选 ...

  10. 数据结构与算法 / 排序算法 / 堆排序

    一.定义 借助堆结构实现的排序算法被称为堆排序. 二.过程说明 1.建堆 (1)方法1 原地建堆,对于数组来说,从前往后:对于树来说,从下向上. 将数组的第一个元素作为堆顶,第二个元素做向堆中插入数据 ...

最新文章

  1. 用Python构建个性化智能闹钟
  2. JavaScript面向对象与传统面向对象的一点区别
  3. 从源码理解ReentrantLock
  4. 【译】LXC and LXD: Explaining Linux Containers
  5. 赠李哲(帮别人名字作诗)
  6. Microsoft Windows Workflow Foundation 入门:开发人员演练
  7. diff git 代码实现_Git 自救指南:这些坑你都跳得出吗?
  8. linux shell 常用参数 $? $# 等等解析
  9. 基于模糊PID控制的光伏系统最大功率点跟踪的研究
  10. 射频微电子学_射频人的双十二,应该这样过……
  11. 2020杭电多校赛 Multi-University Training Contest
  12. DB2查看事务日志使用空间
  13. Round Roundup
  14. HTML5 ——学习笔记整理
  15. [笔录]博客及源程序 出处
  16. java自动违例设计,java违例
  17. 马航 失联飞机 猜想
  18. ESP32/ESP32S3模组在使用Touchpad例子发生flash出错问题解决方式
  19. 华为服务器怎么格式化系统,服务器操作系统格式化
  20. 【每天一个Linux命令】25. 查看文件命令(cat/more/less/tail/tac/nl/od)

热门文章

  1. 平流式隔油池计算_当隔油池整改工作遇上“露天铁板烧”
  2. basequickadapter详解_在kotlin中如何使用BaseQuickAdapter适配器
  3. PCL:点云数据基于法线的边界提取(从最初的法线估计理论推导到最终的边界提取)
  4. 有源晶振和无源晶振的区别
  5. OpenCV(十二)漫水填充算法
  6. android组件什么时候加载到r文件,Android自定义加载loading view动画组件
  7. ATS中的ComboHandler合并回源插件调研
  8. 3G重选至4G--基于优先级
  9. MIT 6.824 Lab2A (raft) -- Leader Election
  10. 多线程:pthread_cond_wait 实现原理