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,一经查实,立即删除!

相关文章

python将整数逆序_python练手入门小项目:字符串的妙用

题目来源&#xff1a;小行&#xff1a;python练手入门小项目详解&#xff08;一&#xff09;1 给任意一个的正整数&#xff0c;要求&#xff1a;一、求它是几位数&#xff0c;二、逆序打印出各位数字。代码&#xff1a;def reversed_integer(number):assert type(number) is in…

精通 ASP.NET MVC 4 学习笔记(一)

这里记录着从 P132 到 P192 的内容。水分很足&#xff0c;大部分是书上的代码&#xff0c;我只加了一些基于我自己的理解的能帮助初学者看懂的注释&#xff0c;并且把书中的部分内容做了一些的拓展。 建立数据层 设置 DI 容器 /// <summary>/// 设置 DI 容器/// </sum…

python之 tkinter中菜单栏快速学习(菜单栏,弹出菜单等)

python之tkinter中菜单栏的快速学习 本文主要讲述菜单栏的一些应用&#xff0c;附上代码&#xff0c;供大家学习。 import tkinter#导入tkinter库 toptkinter.Tk()#创建一个主窗口 top.geometry(400x80000)#指定主窗口大小 top.wm_title(Menu菜单功能的实现) #设置标题名称 ma…

如何命令行远程连接centos_如何使用windows远程控制centOS桌面

如何远程控制centOS桌面? 如何使用windows远程控制centOS桌面?1.查看本机是否有安装vnc(centOS5默认有安装vnc)rpm -q vnc vnc-server如果显示结果为&#xff1a;package vnc is not installedvnc-server-4.1.2-14.e15_3.1那恭喜你&#xff0c;机器上已经安装了vnc&#xff0…

【大数据】Hadoop入门预告版

背景 当今世界&#xff0c;大数据无处不在&#xff0c;它影响到了我们的工作、生活和学习&#xff0c;并将继续施加更大的影响。 大数据用于描述这样的数据组&#xff0c;其规模超出了日常软件在可容忍期限内获取、管理和加工数据的能力。一些网络技术领先的公司持续地投资于昂…

Python ——告白小程序,添加微信号(快来设置你的freestyle吧)

朋友过生日&#xff0c;然后就在搜一些小程序&#xff0c;哈哈哈O(∩_∩)O哈哈~ 然后就搜到了一些表白的小程序&#xff0c; 然后再自己改了改&#xff0c;增加了一个添加微信的功能。然后加载了背景音乐&#xff0c;啦啦啦啦啦&#xff0c;赶紧告白起来吧 图片和音乐可以根据自…

airpodspro窃听模式_AirPods Pro实时收听怎么关闭? AirPods Pro实时收听的使用方法

苹果全新AirPods Pro增加了许多新功能。首先,是控制播放。苹果在AirPods Pro中放弃了敲击手势,并用杆上的力传感器取代了它。控制音乐或视频只需要简单的短按即可。一次按压即可播放或暂停当前播放。两次按压将跳至下一曲目,而三次挤压则向后移动。可以通过按压任一AirPods …

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…

因变量 方差膨胀系数_请问如何计算潜变量的方差膨胀因子(VIF)?

这里提供一个 Python 实现的方法和原理趣分析方差膨胀因子是非常经典缓解多元共线性的方法&#xff0c;原理简单&#xff0c;实现优雅&#xff0c;效果拔群。源代码源数据可私聊俺获取&#xff0c;每天固定时间查看和回复。原理趣析多重线性回归模型的主要假设之一是我们的预测…

下拉到底部加载更多

var p1; active_list();function active_list() {$.ajax({type: "GET",url: "{:U(User/glodLogList_data)}",data: {page:p},dataType: "json",success: function(data){if(datanull){$("#add_more").html(没有更多了);$("#add_m…

Print() 语句以及数字赋值语句 中if-else的使用

#print语句以及num里面if else 的变态语句 x10 num110 if x>8 else 20 #如果中间语句成立为True,则执行输出左边语句&#xff1b;否则为False 则输出右边语句 print(num1) num110 if x>15else 20 #如果中间语句成立为True,则执行输出左边语句&#xff1b;否则为False 则输…

幻世机器人_2014年科幻动作《幻世追踪/启动机械码》BD中英双字幕

◎译  名 幻世追踪/启动机械码(台)◎片  名 Vice◎年  代 2015◎国  家 美国◎类  别 动作/科幻/惊悚/冒险◎语  言 英语◎字  幕 中英双字幕◎IMDB评分 4.0/10 from 3,848 users◎文件格式 BD-RMVB◎视频尺寸 1280 x 720◎文件大小 1CD◎片  长 96…

单链表逆置

单链表的逆置问题&#xff0c;常常遇到&#xff0c;今天总结如下&#xff1a; 方法&#xff1a;头插法&#xff1a; 图示&#xff1a; 代码&#xff1a; //翻转单链表 ListNode* Revers(ListNode* pHead) {ListNode* newhead NULL;ListNode* cur pHead;while(cur){ListNode* …

if-else多级嵌套,输入3/4/5个数寻找最大值(太多了容易乱!!!)

哎呀呀&#xff0c;心累啊&#xff0c;玩这个多级嵌套&#xff0c;眼花~ 多级嵌套有序3个数&#xff08;找最大值&#xff09; a,b,ceval(input("a,b,c")) if a>b:pass #a (a,b)if a>c:print("max",a)if b>c:print(b,c)else:print(c,b)else:p…

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

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

竞态条件和临界区

1. 临界区和竞态条件&#xff1a; 临界区&#xff1a;访问和操作共享数据的代码段&#xff1b; 竞态条件&#xff1a;当有多个线程同时进入临界区时&#xff0c;执行结果取决于线程的执行顺序&#xff1b; 如下述代码&#xff0c;当多个线程同时调用func函数&#xff0c;对共享…

MATLAB程序实现经纬度转换成平面坐标

近期搜了下经纬度坐标转换成直角坐标的程序和原理啥的&#xff0c;哎&#xff0c;真难啊&#xff0c;其实道理都懂吧&#xff0c;下面直接贴代码&#xff0c; 主要是加了个for循环而言&#xff0c;优化输出效果。 %%%MATLAB程序实现经纬度转换成平面尔坐标&#xff1a; M_PI3…

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

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

jquerymobile使用技巧

1&#xff09;ajax开关&#xff08;默认jquery以ajax方式加载页面&#xff09; $.mobile.ajaxEnabled false; 2&#xff09;不编译指定标签 $.mobile.page.prototype.options.keepNative"input"; 3&#xff09;开启dom缓存 $.mobile.page.prototype.options.domCach…