python算法之冒泡排序和选择排序
一、冒泡排序(Bubble sort)
Bubble sort, sometimes referred to as sinking sort, is a simple sorting algorithm that repeatedly steps through the list to be sorted, compares each pair of adjacent items and swaps them if they are in the wrong order. The pass through the list is repeated until no swaps are needed, which indicates that the list is sorted.
Properties
- Worst case performance O(n2)
- Best case performance O(n)
- Average case performance O(n2)
#冒泡排序,将一个数组进行从小到大进行排序
array_a= [80, 24, 28, 33, 19, 44, 8, 17, 22, 16, 12]#定义一个数组,define a array
array_b=[88,21,19,17,19,22,44,28,22,10,5,6]#定义一个数组 define a array
def bubble_sort_min(array_sort): #定义一个buuble_sort函数,该函数参数为数组,返回值为从小到大排序的数组。define a function,the fuction has a array parameter.
#loop_count=0
for i in range(len(array_sort)-1): #数组个数有11个,那么使用冒泡排序需要循环11-1次。n个数,循环n-1次
#print("i=",i)
#print("leni=",len(array_sort)-1)
for j in range(len(array_sort)-i-1): #每循环一次,两两比较,找到最大值放到数组中最后一个位置。第一次循环需要比较10次,第二次比较9次,第三次比较8次...。第一次循环n-1次,第二次循环n-2次,第n-1次循环1次
#print("j=",j)
#print("lenj=", len(array_sort)-i-1)
if array_sort[j]>array_sort[j+1]:#比较两个相邻数组元素的大小
array_sort[j],array_sort[j+1]=array_sort[j+1],array_sort[j]#如果前面的大就交换位置
#loop_count+=1
print("loop_count=", loop_count) #循环次数为n(n+1)/2次
return array_sort#返回排序好的数组 return a new array.
def bubble_sort_max(array_sort): #定义一个buuble_sort函数,该函数参数为数组,返回值为从大到小排序的数组。define a function,the fuction has a array parameter.
for i in range(len(array_sort)-1): #数组个数有11个,那么使用冒泡排序需要循环11-1次。n个数,循环n-1次
for j in range(len(array_sort)-i-1): #每循环一次,两两比较,找到最大值放到数组中最后一个位置。第一次循环需要比较10次,第二次比较9次,第三次比较8次...。
if array_sort[j]<array_sort[j+1]:#比较两个相邻数组元素的大小
array_sort[j],array_sort[j+1]=array_sort[j+1],array_sort[j]#如果前面的小就交换位置
return array_sort#返回排序好的数组 return a new array.
bubble_sort_min(array_a)#调用函数 call bubble_sort function
#bubble_sort(array_b)#调用函数
bubble_sort_max(array_b)
print("array_a=",array_a)#打印输出第一个排好序的数组 print array
print("array_b=",array_b)#打印输出第二个排好序的数组
二、选择排序(Selection sort)
The algorithm works by selecting the smallest unsorted item and then swapping it with the item in the next position to be filled.
The selection sort works as follows: you look through the entire array for the smallest element, once you find it you swap it
(the smallest element) with the first element of the array. Then you look for the smallest element in the remaining array
(an array without the first element) and swap it with the second element. Then you look for the smallest element in the remaining
array (an array without first and second elements) and swap it with the third element, and so on. Here is an example,
array_a=[33,32,31,30,29,28,27,26,25,24,23]
#array_a=[23,21,11,33,34,12,45,17]
small_num_index=0 #初始列表下标,默认是数组的第一个元素的下标,也就是array_a[0]
loop_count=0 #统计循环共执行了次数。
swap_count=0 #统计排序时数组元素的值实际交换的次数
for i in range(len(array_a)-1): #大循环,循环的次数应该等于数组个数n减去1次,即n-1次
print("small_num_index3=", small_num_index) #每次循环时最小值下标值,第一次循环为0,第二次循环为1,第三次循环为2....
for j in range(i,len(array_a)): #小循环,小循环的开始下标值为大循环下标,结束为数组长度-1
if array_a[j]<array_a[small_num_index]: #如果该数组元素比每次最小下标数组元素的值小则将最小下标值改为该元素下标
small_num_index=j
swap_count+=1
loop_count+=1
else:
print("the smallest num is:", array_a[small_num_index]) #每次执行完后找到最小值得数组元素
print("small_num_index1=",small_num_index)
array_a[small_num_index],array_a[i]=array_a[i],array_a[small_num_index] #将最小下标元素和最小值元素的值互换,即将最小值放在每次小循环最小下标内。
small_num_index=i+1 #将最小值下标设置为下一次循环下标最小值
print("small_num_index2=", small_num_index)
print("array_a selection_sort:",array_a)
print("swap_count=",swap_count)
print("loop_count=",loop_count) #循环次数为(n+2)(n-1)/2 次
三、两个排序的区别联系
1.冒泡排序是通过数组相邻元素两两比较,大的排后面,一次比较找到整个数组最大值放在数组最后一个位置。小循环时,通过控制小循环的循环下标range j=len(array)-i-1忽略掉数组最后已经排列好的一个元素,从后往前直到最前面。
2.选择排序是通过从前往后,从第一个数组元素和后面的元素比较,如果后面的元素小,就把该元素的值和后面的继续比较,找到最小值后,和第一个数组元素的值交换,把最小值放到数组的第一个位置。然后通过控制小循环的下标(j in range(i,len(array)))忽略掉第一个已经排好序的数组元素,从第二个元素开始继续循环找到第二小值,放到第二个元素上,以此类推,直至最后。
3.选择排序因每次循环直接找到最小值,因此需要一个变量small_num_index来记录最小值的数组元素下标。而冒泡因是两两比较,每次将大的值放到后面,所以不需要额外的变量。
4.冒泡排序执行循环次数为n(n+1)/2次,选择排序执行循环次数(n+2)(n-1)/2 次。
python算法之冒泡排序和选择排序的更多相关文章
- JavaScript算法(冒泡排序、选择排序与插入排序)
冒泡排序.选择排序与插入排序复杂度都是二次方级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看<学习JavaScript数据结构与算法>介绍的冒泡排序,选择排序看 ...
- Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析
前言:排序在算法中的地位自然不必多说,在许多工作中都用到了排序,就像学生成绩统计名次.商城商品销量排名.新闻的搜索热度排名等等.也正因为排序的应用范围如此之广,引起了许多人深入研究它的兴趣,直至今天, ...
- 【排序算法】——冒泡排序、选择排序、插入排序、Shell排序等排序原理及Java实现
排序 1.定义: 所谓排序,即是整理文件中的内容,使其按照关键字递增或递减的顺序进行排列. 输入:n个记录,n1,n2--,其对应1的关键字为k1,k2-- 输出:n(i1),n(i2)--,使得k( ...
- 我在北京找工作(二):java实现算法<1> 冒泡排序+直接选择排序
工作.工作.找工作.经过1个多星期的思想斗争还是决定了找JAVA方面的工作,因为好像能比PHP的工资高点.呵呵 :-) (其实我这是笑脸,什么QQ输入法,模拟表情都没有,忒不人性化了.) 言归正传, ...
- Java常用的经典排序算法:冒泡排序与选择排序
一.冒泡排序 冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为 ...
- 「浙江理工大学ACM入队200题系列」问题 A: 零基础学C/C++34—— 3个数比较大小(冒泡排序与选择排序算法)
本题是浙江理工大学ACM入队200题第四套中的A题,同时给出了冒泡排序和选择排序算法 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习 ...
- Java排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)
一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法 ...
- 算法——蛮力法之选择排序和冒泡排序c++实现
这次实现的是蛮力法中的两个例子,选择排序法和冒泡排序法,使用的编译环境是vs2013,下面对这两个算法做一个简单介绍,然后是两个算法的c++实现代码. 选择排序法比较的范围是整个列表,每次扫描结束找出 ...
- js中常见的数组排序算法-冒泡排序和选择排序
reverse( ) 数组逆序 // reverse() 数组逆序 var arr = ["边境牧羊犬", "德国牧羊犬", "金毛" ...
随机推荐
- Oracle深入学习
一.甲骨文公司介绍 甲骨文公司,是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩.1989年正式进入中国市场. 2013年,甲骨文已超越 IBM ,成为继 Microsoft 后全球第二大 ...
- 非常完善的两个微服务框架比较(SpringCloud与Dubbo)
微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值. 虽然微服务架构没有公认的技术标准和规范或者草案,但 ...
- 在树莓派2或3的kali上 RCA(a/v connector)接口的正确使用方法(多图)(原创)
AV接口又称(RCA),AV接口算是出现比较早的一种接口,它由黄.白.红三种颜色的线组成,其中黄线为视频,红色为左声道,白色为右声道. ...
- 11. IDS (Intrusion detection systems 入侵检测系统 6个)
Snort该网络入侵检测和防御系统擅长于IP网络上的流量分析和数据包记录. 通过协议分析,内容研究和各种预处理器,Snort可以检测到数千个蠕虫,漏洞利用尝试,端口扫描和其他可疑行为. Snort使用 ...
- 使用C#的aforge类库识别验证码实例
一: 验证码处理 1. 一般处理原则 这种验证码为什么说跟没有一样,第一点:字体规范工整,第二点:不旋转扭曲粘连,第三点:字体颜色单一,下面看处理步骤. 这里要注意的是,aforge只接受像素格式为 ...
- SpeedReader for Mac(快速阅读器)v1.6免费版
SpeedReader for Mac是一款运行在Mac平台上的阅读软件,通过这款软件就可以自行调整阅读速度.通过SpeedReader Mac版用户可以将想要阅读的内容拖入到软件中,调整速度和字体, ...
- maven依赖冲突
https://blog.csdn.net/noaman_wgs/article/details/81137893
- elasticsearch -- kibana安装配置
Kibana 是为Elasticsearch设计的开源分析和可视化平台,你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互.你可以很容易实现高级的数据分析 ...
- Wpf开源收集
1,到底有哪些开源MVVM框架? 前面介绍了WPF的基本概念和一些相关知识,我们了解到开发WPF应用程序可以使用现成的框架和模式,最为合适的莫过于时下正热的MVVM模式,所以这里我们也列出针对MVVM ...
- Azure CosmosDB (6) 冲突类型和解决策略
<Windows Azure Platform 系列文章目录> 当我们为CosmosDB配置多个Azure Region写入,就需要考虑冲突类型和解决策略. 对于配置了多个写入区域的 Az ...