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

文章目录

  • 0. 相关概念
  • 一. 冒泡排序
  • 二. 选择排序
  • 三. 插入排序
  • 四. 希尔排序
  • 五. 快速排序
  • 六. 归并排序
  • 七. 其他

0. 相关概念

  • 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
  • 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
  • 时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
  • 空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。
    在这里插入图片描述

一. 冒泡排序

算法过程:
进行N-1趟操作,每一趟,都是不断的比较相邻的元素,那么一趟下来,就会将最大的移到排好顺序的最后面的位置。
在这里插入图片描述

代码实现:

def bubble_sort(alist):"""冒泡排序:最优时间复杂度:O(n)最坏时间复杂度:O(n^2)稳定性:稳定"""n = len(alist)for j in range(n-1):for i in range(0,n-1-j):if alist[i] > alist[i+1]:alist[i],alist[i+1] = alist[i+1],alist[i]return liif __name__ == '__main__':li = [54,26,93,17,77,31,44,55,20]print(li)li = bubble_sort(li)print(li)

二. 选择排序

在这里插入图片描述

算法过程:
初始状态:无序区为R[1…n],有序区为空;

第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1…i]和R[i+1…n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;

n-1趟结束,数组有序化结束。

代码实现:

def select_sort(alist):"""选择排序最优时间复杂度:O(n^2)最坏时间复杂度:O(n^2)稳定性:不稳定"""n = len(alist)for j in range(n-1):min_index = jfor i in range(j+1,n):if alist[min_index] > alist[i]:min_index = ialist[j],alist[min_index] = alist[min_index],alist[j]if __name__ == '__main__':li = [54,26,93,17,77,26,31,44,55,20]print(li)select_sort(li)print(li)

三. 插入排序

在这里插入图片描述
算法过程:
从第一个元素开始,该元素可以认为已经被排序;

取出下一个元素,在已经排序的元素序列中从后向前扫描;

如果该元素(已排序)大于新元素,将该元素移到下一位置;

重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

将新元素插入到该位置后;

重复步骤2~5。

代码实现:

def insert_sort(alist):"""插入排序:最优时间复杂度:O(n)最差时间复杂度:O(n^2)稳定性:稳定"""n = len(alist)for j in range(1, n):i = jwhile i > 0:if alist[i] < alist[i-1]:alist[i], alist[i-1] = alist[i-1], alist[i]i -= 1else:breakif __name__ == '__main__':li = [54,26,93,17,77,31,44,55,20]print(li)insert_sort(li)print(li)

四. 希尔排序

在这里插入图片描述

算法过程:
选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;

按增量序列个数k,对序列进行k 趟排序;

每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

代码实现:

def shell_sort(alist):"""shell排序:最优时间度:根据步长序列的不同而不同最差时间度:O(n^2)稳定性:不稳定"""n = len(alist)gap = n // 2while gap > 0:# 希尔排序与插入排序的区别就是gap步长for j in range(gap,n):i = jwhile i > 0:if alist[i] < alist[i - gap]:alist[i], alist[i-gap] = alist[i-gap], alist[i]i -= gapelse:break# 缩短gap步长gap //= 2if __name__ == '__main__':li = [54,26,93,17,77,26,31,44,55,20]print(li)shell_sort(li)print(li)

五. 快速排序

在这里插入图片描述
算法过程:
从数列中挑出一个元素,称为 “基准”(pivot);

重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

代码实现:

def quick_sort(alist,first,last):"""快速排序:最优复杂度:O(nlogn)最坏复杂度:O(n^2)稳定性:不稳定"""if first >= last:returnmid_value = alist[first]low = firsthigh = lastwhile low < high:while low < high and alist[high] >= mid_value:high -= 1alist[low] = alist[high]while low < high and alist[low] < mid_value:low += 1alist[high] = alist[low]# 从循环退出时,low=highalist[low] = mid_value# 对low左边的列表执行快速排序quick_sort(alist,first,low-1)# 对low右边的列表排序quick_sort(alist,low+1,last)if __name__ == '__main__':li = [54, 26, 93, 17, 77, 31, 44, 55, 20]print(li)quick_sort(li, 0, len(li)-1)print(li)

六. 归并排序

在这里插入图片描述
算法过程:

把长度为n的输入序列分成两个长度为n/2的子序列;

对这两个子序列分别采用归并排序;

将两个排序好的子序列合并成一个最终的排序序列。

代码实现:

def merge_sort(alist):"""归并排序最优时间度:最坏时间度:稳定性:"""n = len(alist)if n <= 1:return alistmid = n//2# left采用归并排序后形成的有序的新的列表left_li = merge_sort(alist[:mid])# right采用归并排序后形成的有序的新的列表right_li = merge_sort(alist[mid:])# 将两个有序的子序列合并为一个新的整体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 += 1result += left_li[left_pointer:]result += right_li[right_pointer:]return resultif __name__ == '__main__':li = [54,26,93,17,77,31,44,55,20]print(li)li_sort = merge_sort(li)print(li_sort)

七. 其他

其他算法的详细过程请参考:https://blog.csdn.net/weixin_41571493/article/details/81875088

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 问题

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 maven run as --install 时出错&#xff0c;提示信息如下&#xff1a; [ERROR] Failed to execute goal org.apache.maven.plugins:m…

spring cloud(九):各组件常用配置参数

1、Eureka的常用配置Eureka Server端eureka.server.enable-self-preservation # 设为false&#xff0c;关闭自我保护eureka.server.eviction-interval-timer-in-ms # 清理间隔&#xff08;单位毫秒&#xff0c;默认是60*1000&#xff09;eureka.environmentdev #指定环境eureka…

JSON与XML的区别比较

1.定义介绍 (1).XML定义 扩展标记语言 (Extensible Markup Language, XML) &#xff0c;用于标记电子文件使其具有结构性的标记语言&#xff0c;可以用来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type defini…

ajax传递数组:属性traditional设置

jQuery.ajaxSettings.traditional true; $.post("",function(){});转载于:https://www.cnblogs.com/HansZimmer/p/9334006.html

Python面试题总结(9)--高级特性

文章目录1. 函数装饰器有什么作用&#xff1f;请列举说明&#xff1f;2. Python 垃圾回收机制&#xff1f;3. 魔法函数 _call_怎么使用?4. 如何判断一个对象是函数还是方法&#xff1f;5. classmethod 和 staticmethod 用法和区别6. Python 中的接口如何实现&#xff1f;7. Py…

I/O流讲解

本文来自&#xff1a;曹胜欢博客专栏&#xff1a;http://blog.csdn.net/csh624366188 在软件开发中&#xff0c;数据流和数据库操作占据了一个很重要的位置&#xff0c;所以&#xff0c;熟悉操作数据流和数据库&#xff0c;对于每一个开发者来说都是很重要的&#xff0c;今天就…

Spring Boot入门(9)网页版计算器

介绍 在写了前八篇Spring Boot项目的介绍文章后&#xff0c;我们已经初步熟悉了利用Spring Boot来做Web应用和数据库的使用方法了&#xff0c;但是这些仅仅是官方介绍的一个例子而已。   本次分享将介绍笔者自己的一个项目&#xff1a;网页版计算器&#xff0c;以这两篇博客…

shell编程基础(七): 处理文件命令sed与awk

一、sed&#xff08;以行为单位处理文件&#xff09; sed意为流编辑器&#xff08;Stream Editor&#xff09;&#xff0c;在Shell脚本和Makefile中作为过滤器使用非常普遍&#xff0c;也就是把前一个程序的输出引入sed的输入&#xff0c;经过一系列编辑命令转换为另一种格式输…

数据结构与算法--6.二分查找

文章目录一. 二分查找二. 代码实现一&#xff1a;使用递归三. 代码实现二&#xff1a;非递归一. 二分查找 二. 代码实现一&#xff1a;使用递归 def binary_search(alist, item):"""二分查找&#xff1a;使用递归"""n len(alist)if n > 0:m…

SpringMVC请求处理流程、springMVC工作流程

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 页面请求到来 --> 前端控制器&#xff08;DispatcherServlet&#xff09;收到请求&#xff0c;请求 处理映射器&#xff08;Hanle…

Android的TextView在显示文字的时候,如果有段中文有英文,有中文,有中文标点符号,你会发现,当要换行的时候遇到中文标点, 这一行就会空出很多空格出来...

一、问题描述&#xff1a; Android的TextView在显示文字的时候&#xff0c;如果有段中文有英文&#xff0c;有中文&#xff0c;有中文标点符号&#xff0c;你会发现&#xff0c;当要换行的时候遇到中文标点&#xff0c; 这一行就会空出很多空格出来。原因是&#xff1a; 1&…

什么是IDE

集成开发环境&#xff08;IDE&#xff0c;Integrated Development Environment &#xff09;是用于提供程序开发环境的应用程序&#xff0c;一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务…

vue 学习

http://jspang.com/ vue 学习 vue 学习 转载于:https://www.cnblogs.com/qianjin888/p/9342031.html

策略模式-Strategy Pattern

解决问题 将算法按照策略或场景封装起来&#xff0c;以方便按照不同的场景执行不同的策略。它很好的解决了通过if...else 来决策行为而带来的代码和逻辑复杂性。 应用场景 一个经常被拿来举例的场景是收银员收银场景&#xff1a;它需要根据不同的场景&#xff08;是否为会员、有…

ssm框架下 tiles框架 的使用

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 tiles框架的工作 在springMVC工作流程中属于视图解析器 解析视图这一步。算是视图解析器的一个插件&#xff0c;作了视图解析这步的一部…

数据结构与算法--7.树的基础知识

文章目录一. 树的概念二. 树的术语三. 树的种类四. 树的存储和表示五. 常见的树的应用场景一. 树的概念 二. 树的术语 三. 树的种类 四. 树的存储和表示 五. 常见的树的应用场景

运用java 多线程模拟火车售票。。。。

public class Demo01 { public static void main(String[] args) { // TODO Auto-generated method stub //多线程并行时&#xff0c;会出现的问题 //同步&#xff1a; //买火车票&#xff0c;四个窗口A,B,C,D //创建任务 TicketTask task new TicketTask(); //四个窗口A,B,C,…