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 = ["边境牧羊犬", "德国牧羊犬", "金毛" ...
随机推荐
- 6. Vulnerability scanners (漏洞扫描器 11个)
Nessus是最流行和最有能力的漏洞扫描程序之一,特别为UNIX系统. 它最初是免费的和开源的,但是他们在2005年关闭了源代码,并在2008年删除了免费的“注册Feed”版本.现在要每年花费2,19 ...
- 记NOIP2018
day0 中午在机房水了一波出发,坐了一下午的车,5点到了大门对面的红旗宾馆.南山中学的和我们住在一个宾馆里面,Z教练似乎同他们关系很好,见面还打招呼. 红旗宾馆附近特别偏僻,出门就是修路的工地,后面 ...
- himm的使用
1.设置管脚复用 himm 0x200F0100 1 himm 0x200F0104 1 2.设置GPIO_DIR himm 0x201C0400 0xff 3.设置GPIO_DATA himm 0x ...
- Django学习笔记之视图高级-HTTP请求与响应
Django限制请求method 常用的请求method GET请求 GET请求一般用来向服务器索取数据,但不会向服务器提交数据,不会对服务器的状态进行更改.比如向服务器获取某篇文章的详情. POST ...
- ORACLE数据库在导入导出时序列不一致的问题
ORACLE数据库在导入导出时序列不一致的问题 在使用ORACLE数据库时,当给一个表设置自增字段时,我们经常会使用到序列+触发器来完成.但当你需要对数据库进行导入导出时,序列很容易出问题. 当你 ...
- jdk1.8源码解析(1):HashMap源码解析
jdk1.8 HashMap数据结构 图1-HashMap类图 图2-TreeNode类图 由图1-HashMap类图可知HashMap底层数据结构是由一个Node<K,V>的数组构成.具 ...
- bpmn-js起步
https://blog.csdn.net/u013253924/article/details/85784002 通过本文逐步熟悉bpmn-js. 快速介绍: bpmn.js是一个BPMN2.0渲染 ...
- react连连看
// Math.floor(t * Math.random()); var isInclude = function (array, element) { let alen = array.len ...
- python爬虫学习笔记(一)——环境配置(windows系统)
在进行python爬虫学习前,需要进行如下准备工作: python3+pip官方配置 1.Anaconda(推荐,包括python和相关库) [推荐地址:清华镜像] https://mirrors ...
- crf++实现中文分词简单例子 (Windows crf++0.58 python3)
学习自然语言处理的同学都知道,条件随机场(crf)是个好东西.虽然它的原理确实理解起来有点困难,但是对于我们今天用到的这个crf工具crf++,用起来却是挺简单方便的. 今天只是简单试个水,参考别人的 ...