python 下的数据结构与算法---6:6大排序算法

顶先最后推荐:哈哈,意思是放到顶部强调其重要性,但是应该我总结的六种算法看完了后再看的一篇醍醐灌顶的文章

 

一:冒泡排序(Bubble Sort)

  原理:假设有n个数,第一轮时:从第一个元素开始,与相邻的元素比较,如果前面的元素小就交换,直到第n-1个元素时,这样的结果是将最大的元素放到了最后,同理,第二轮还是从第一个元素开始比较,直到第n-2个元素,这样能够把剩下的n-1个数中的最大的数放到第n-1的位置,一直这样进行n-1轮就能够完成排序。 

 1 def Bublesort(seq):
 2     i = 0
 3     j = 0
 4     while i < len(seq):
 5         while j < len(seq)-i-1:
 6             if seq[j] > seq[j+1]:
 7                 seq[j],seq[j+1] = seq[j+1],seq[j]
 8             else:
 9                 j+=1
10         j=0
11         i+=1
12 
13 a=[3,4,6,2,1]
14 Bublesort(a)
15 print(a)
冒泡排序

  由代码可知,其时间复杂度为O(n2).

 

二:选择排序(Selection Sort)

  原理:选择排序的思路非常简单,每次都遍历找出上次剩下的元素中的最大数,然后和剩下数中随后一个元素交换位置,一个进行n-1次

 1 #coding:utf-8
 2 #Attention:max标志需取为seq[0],我刚开始取了0,这会导致最后一次比较时出问题
 3 def SelectionSort(seq):
 4     i,j,maxel = 0,0,seq[0]
 5     while i < len(seq):
 6         while j < len(seq)-i:
 7             if seq[j] > maxel:
 8                 maxel = j
 9             j+=1
10         seq[maxel],seq[len(seq)-i-1] = seq[len(seq)-i-1],seq[maxel]
11         j,maxel=0,seq[0]
12         i+=1
13 
14 a=[3,4,6,2,1]
15 SelectionSort(a)
16 print(a)
选择排序

  可以看出的是,其时间复杂度依然是O(n2),看起来和冒泡排序一样,但由于每轮其交换位置的次数少,故实际上其比冒泡排序好。

 

三:插入排序(Insertion Sort)

  原理:如下图所示,将第一个元素作为标准,每次将下一个元素放到前面正确的位置中去。

  技巧:从已排好序元素最后一个开始遍历比较,因为插入移动只会移动其后面的元素。

  

 1 def insertion_sort(a_list):
 2     for index in range(1, len(a_list)):
 3         current_value = a_list[index]
 4         position = index
 5         while position > 0 and a_list[position - 1] > current_value:        #从目前元素开始向前,若>目前值就后移一位
 6             a_list[position] = a_list[position - 1]
 7             position = position - 1
 8         a_list[position] = current_value
 9 
10 a = [54, 26, 93, 17, 77, 31, 44, 55, 20]
11 insertion_sort(a)
12 print(a)
插入排序

  依旧可以看出的是,其时间复杂度为O(n2),但是他的不同之处在于其始终保持了一个部分有序的序列

 

四:希尔排序(Shell Sort)

  希尔排序这章书里面的配图不好,导致我理解错误直到运行程序出错才发现错误,后来看了些其他资料弄明白了。其实希尔排序就是跳跃式插入排序,我们试想一下,如果一个元素集是9,8,7,6,5,4,3,2,1,那么每次插入排序都要全部后移了,这样效率极低,如果能够不按顺序的进行插入排序就好多了,虽然每次并没有完全排好序,但是能够让他们离真实的位置更近,这就是其优势所在了。

  实现原理:每次取一个gap,第一次取集合元素个数整除2的结果,然后对从首元素开始每gap距离的元素组合成一个组并对其进行插入排序,假设集合[54, 26, 93, 17, 77, 31, 44, 55, 20],那么第一次gap为9//2=4,那么就能够有这些组:[54,77,20],[26,31],[93,44],[17,55],注意,并不是对其真的分组,只是将其看作一组后进行插入排序,那么结果是:[20, 26, 44, 17, 54, 31, 93, 55, 77],到此,第一次完成。第二次把gap改为上次gap//2的结果,也就是2,所以对上次的结果分组为[20,44,54,93,77],[26,17,31,55],对其进行插入排序后的结果是[20, 17, 44, 26, 54, 31, 77, 55, 93],到此第二次完成。第三次gap为1,注意,当gap为1时就表明是最后一轮了,最上此结果[20, 17, 44, 26, 54, 31, 77, 55, 93]全部进行插入排序就能够得到结果了。【仔细看看就能够发现其每次排序后真的是数字离其真实位置更近了】。

  注意:有个控制循环的条件就是每次分组的组数其实就是gap的值,容易看出是两层控制,外层控制进入的哪组分组,内层控制具体每组的插入排序

 1 def shell_sort(a_list):
 2     sublist_count = len(a_list) // 2
 3     while sublist_count > 0:
 4         for start_position in range(sublist_count):
 5             gap_insertion_sort(a_list, start_position, sublist_count)
 6         print("After increments of size", sublist_count, "The list is",a_list)
 7         sublist_count = sublist_count // 2
 8 
 9 def gap_insertion_sort(a_list,start, gap):
10     for i in range(start + gap, len(a_list), gap):
11         current_value = a_list[i]
12         position = i
13         while position >= gap and a_list[position - gap] > current_value:
14             a_list[position] = a_list[position - gap]
15             position = position - gap
16         a_list[position] = current_value
17 
18 a_list = [54, 26, 93, 17, 77, 31, 44, 55, 20]
19 shell_sort(a_list)
20 print(a_list)
希尔排序

  

 五:归并排序(Merge Sort)

  原理图:由图可以看出,其也是用了递归原理,base就是只剩一个元素时返回其本身

  

 1 def partition(seq, start, mid, stop):
 2     lst = []
 3     i = start
 4     j = mid
 5     while i < mid and j < stop:
 6         if seq[i] < seq[j]:
 7             lst.append(seq[i])
 8             i+=1
 9         else:
10             lst.append(seq[j])
11             j+=1
12     while i < mid:
13         lst.append(seq[i])
14         i+=1
15     while j < stop:
16         lst.append(seq[j])
17         j+=1
18     for i in range(len(lst)):
19         seq[start+i]=lst[i]
20 
21 def mergeSortRecursively(seq, start, stop):
22     if start >= stop-1:
23         return
24     mid = (start + stop) // 2
25     mergeSortRecursively(seq, start, mid)
26     mergeSortRecursively(seq, mid, stop)
27     partition(seq, start, mid, stop)
28 
29 a=[3,4,6,8,2,1,5,9]
30 mergeSortRecursively(a, 0, len(a))
31 print(a)
归并排序

  来分析下其时间复杂度吧,由于每次都将list二分,这是logn,而每次排列是n,由于这两小步组成一步,故时间复杂度为O(nlogn)

 

六:快速排序(Quick Sort)

  原理:如下,第一次以第一个元素为标志,将后面小的放他左边,大的放他右边,而后将其放到中间。第二次分别在其两边重复这样的过程,最后直到每组只有一个数据。

  

  有个需要注意的是最坏情况下为以排好序的集合,那么后面的数都标志大或者小,操作太多或者无效,最理想的是标志能够是平均值左右,故最好对数据进行随机化处理。

  还有,看完代码后注意比较,可以是快速排序与归并排序是某种程度相反的,归并到了最后两个元素才开始排序,从部分有序积累到全部有序,而二分是反的,从第一次二分就是整个数列的二分,,最后二分到只有两个元素时,此时完成了全部有序。

 1 import random
 2 def partition(seq, start, stop):
 3     pivotIndex = start
 4     pivot = seq[pivotIndex]
 5     i = start+1
 6     j = stop-1 
 7     while i <= j:
 8         while pivot > seq[i]:
 9             i+=1
10         while pivot < seq[j]:
11             j-=1
12         if i < j:
13             seq[j],seq[i] = seq[i],seq[j]
14             i+=1
15             j-=1
16     seq[pivotIndex],seq[j] = seq[j],pivot
17     return j
18 
19 def quicksortRecursively(seq, start, stop):
20     if start >= stop-1:
21         return
22     pivotIndex = partition(seq, start, stop)
23     quicksortRecursively(seq, start, pivotIndex)
24     quicksortRecursively(seq, pivotIndex+1, stop)
25 
26 def quicksort(seq):
27 # randomize the sequence first
28     for i in range(len(seq)):
29         j = random.randint(0,len(seq)-1)
30         seq[i],seq[j] = seq[j],seq[i]
31 
32     quicksortRecursively(seq, 0, len(seq))
33 
34 a=[3,4,6,8,2,1,5,9]
35 quicksort(a)
36 print(a)
快速排序

  同理可以分析出其时间复杂度为O(nlogn)

转载于:https://www.cnblogs.com/pengsixiong/p/5323772.html

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

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

相关文章

UML基础知识点

UML : unified Modeling Language 统一建模语言1.对系统问题进行分析和建模2.非专利的第三代建模和规约语言3.UML是一种开放的方法、用于说明、可视化、构建、编写一个正在开发的、面向对象的、软件密集系统的开放方法4.UML集成了Booch、OMT和面向对象软件工程的概念面向对…

如何实现listbox选项,然后双击鼠标实现选项的删除

如何实现双击鼠标左键然后删除列表框中的选项呢&#xff1f; 只需要两步&#xff1a; 第一步&#xff0c;建立listbox控件与鼠标事件的绑定并给一个跳转函数; 如本例中的listbox控件&#xff0c;绑定事件<Double-Button-1>&#xff0c;其含义是指双击鼠标左键&#xf…

页面 接收跳转数据_【实战案例】在线教育渠道落地页数据分析

商业数智化工作坊“ 与多位来自高校的专家学者与业界导师共同探索商业数字化、智能化发展趋势、技术及实践培养数字思维&#xff0c;掌握数智化工具&#xff0c;实现管理能力跃迁”1背景与目标通过对跟渠道落地页数据的分析&#xff0c;优化用户路径&#xff0c;提高各环节的转…

ANSYS2020R2与Solidworks2019进行关联,但2019安装完后打开出现无法获得下列许可SOLIDWORKS Standard.使用许可文件不支持此版本(-21,126,0)

本身想将ANSYS2020R2与Solidworks进行关联&#xff0c;本身电脑上安装了2016版本&#xff0c;但是使用ANSYS2020R2软件&#xff0c;无法关联上。又没找到相应方法去解决&#xff0c;估计是版本问题无法关联上吧&#xff0c;所以就重新下个高点的版本试试。在网上下载相关软件&a…

《Linux内核》课本读书笔记 第三章

转载于:https://www.cnblogs.com/bushifudongjing/p/5339017.html

ANSYS Workbench对称建模

ANSYS Workbench对称建模 &#xff08;使用版本为ANSYS 2020R2&#xff09; 一、循环对称建模 1、建立三维模型。拖出一个静力学分析模块&#xff0c;材料保持系统默认&#xff0c;在Design Modeler中建立圆盘的1/4模型。外圆半径20m&#xff0c;内圆半径10m&#xff0c;厚度5m…

毕业论文排版之Word 中公式居中,编号靠右该怎么设置(针对左右不对称页边距)

首先感谢博主这篇&#xff0c;大家基本可以参照这个&#xff1a; http://t.csdn.cn/s0FY7&#xff1b; http://t.csdn.cn/FjmbH&#xff1b; 但是由于博主的是规规整整的页面边距&#xff0c;一篇为上下左右均为2cm&#xff0c;另一篇上下2.54cm左右3.18cm。ps:如果你为以上的页…

workbench出现“Unable to start the geometry editor”

今天上午打开workbench遇到这个“Unable to start the geometry editor”问题&#xff0c;但是重启软件还是没用&#xff0c;所以网上找了下。 方法1、来源百度——大向日葵爱太阳&#xff1a; 我刚出现这样的问题&#xff0c;解答办法是将你安装主程序下的破解文件的路径改一…

ant4 多个form 验证_爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别...

点击上方“早起Python”&#xff0c;关注并“星标”每日接收Python干货&#xff01;本文含 3321 字&#xff0c;9代码片段建议阅读 8 分钟前言 在我们写爬虫的过程中&#xff0c;目标网站常见的干扰手段就是设置验证码等&#xff0c;本就将基于Selenium实战讲解如何处理弹窗和验…

一建机电实务教材电子版_20年一建其实并不难,官方出版:复习题集(精修),速做速提90分...

20年一建其实并不难&#xff0c;官方出版&#xff1a;复习题集&#xff08;精修&#xff09;&#xff0c;速做速提90分一建法规管理经济建筑市政机电水利等根据《一-级建造师执业资格考试大纲》(2018 年版) 和《2020年版全国一级建造师执业资格考试用书》&#xff0c;组织全国著…

pcb板子开窗_PCB 层定义

PCB 层定义在EDA软件的专门术语中&#xff0c;有很多不是有相同定义的。以下就字面上可能的意义来解释。 Mechnical: 一般多指板型机械加工尺寸标注层 。Keepoutlayer: 定义不能走线、打穿孔(via)或摆零件的区域。这几个限制可以独立分开定义。 Topoverlay: 无法从字面得知其意…

上的img表示什么_方向盘上的SET、RES和CNL,表示什么意思?别弄错了

很多人买车都希望能买到一款称心如意的车型&#xff0c;包括价格、配置、性能以及质量都符合自己的需求。当然&#xff0c;不管是什么东西都不可能做到完美&#xff0c;就拿汽车来说&#xff0c;即便是几百万上千万的豪车也是有缺点的&#xff0c;更何况普通的十几万的家用车。…

数学题 HDOJ——2086 简单归纳

哎 真的是懒得动脑子还是怎么滴。。。 题目如下 Problem Description有如下方程&#xff1a;Ai (Ai-1 Ai1)/2 - Ci (i 1, 2, 3, .... n).若给出A0, An1, 和 C1, C2, .....Cn.请编程计算A1 ?参考网上题解。。。因为&#xff1a;Ai(Ai-1Ai1)/2 - Ci, A1(A0 A2 )/2 - C1;A2…

最大联通子数组的和

最大联通子数组的和 在几次“迭代”开发数组的项目之后老师又布置了这个“联通数组”的任务&#xff0c;当然&#xff0c;此次任务依旧是“结对编程”&#xff0c;要求如下&#xff1a; 1、题目&#xff1a;返回一个二维数整数组中最大联通子数组的和&#xff1b; 2、数组中有正…

曲线 线性回归_GRAPHPAD作图技巧(二)--拟合曲线

计算药物半抑制浓度IC50的拟合曲线图的做法&#xff1a;第一步&#xff1a;使用的版本是Graphpad Prism 5&#xff0c;打开软件后&#xff0c;选择XY作图方式&#xff1a;第二步&#xff1a;将实验所得的数据填写入图表中&#xff0c;注意x轴写入的是log[药物]&#xff0c;比如…

2 引入失败_苦等2年!总投资2800万!镇江首个民国风商场,来了!

超级重磅&#xff01;就在近日&#xff01;镇江备受关注的首个民国风商场九如商业广场终于完工&#xff0c;招商马上启动项目施工2年&#xff0c;总投资约2800万计划引入酒店、商业、超市等目前老宴春酒楼已确定入驻01总投资2800万&#xff01;九如商业广场终于完工&#xff0c…

EasyDarwin开源手机直播方案:EasyPusher手机直播推送,EasyDarwin流媒体服务器,EasyPlayer手机播放器...

在不断进行EasyDarwin开源流媒体服务器的功能和性能完善的同时&#xff0c;我们也配套实现了目前在安防和移动互联网行业比较火热的移动端手机直播方案&#xff0c;主要就是我们的 EasyPusher直播推送项目 和 EasyPlayer播放器项目&#xff1b; 先大概对EasyPusher和EasyPlayer…

以下不属于时序逻辑电路的有_电工电子技术(不建议浪费时间学习的科目)

(声明&#xff1a;本资料来自网络&#xff0c;侵权请告知删除。文末有全套高清版资料下载链接&#xff0c;敬请下载学习)2019年7月在天津召开的土力学及岩土工程年会上&#xff0c;有一场青年教师的土力学讲课竞赛&#xff0c;由我作一些点评&#xff0c;其中关于土颗粒与土骨架…

12伏的蓄电池有几个单格组成_蓄电池的结构和识别

蓄电池是储备电能的一种直流装置。蓄电池充电时将电能转变为化学能&#xff0c;使用时内部化学能转变为电能向外输送给用电设备。蓄电池充放电过程是一种完全可逆的化学反应&#xff0c;因为蓄电池的充电和放电过程&#xff0c;可以重复循环多次&#xff0c;所以又称为二次电池…

第四周JAVA作业

本次作业实现实现了大文件快速拷贝 package copy; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class CopyFile { /** * param args */ public static void main(String[] args) { long startTime System.currentT…