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 = ["边境牧羊犬", "德国牧羊犬", "金毛" ...
随机推荐
- 虚拟机安装精简版centos7过程
虚拟机配置工作如下所示 1.创建虚拟机 使用键盘组合键CTRL+N2.选择自定义(高级) 如图所示: 3.默认如何所示: 4.选择 稍后安装操作系统 如图所示: 5.选择对应的操作系统 如何所示 6 ...
- Just nothing
I know that's I should do what I can to find a job But I can't focus on it I am always sad and I can ...
- 2019软件工程第二次作业(VS2017中对C++的单元测试)
建立工程,分别编写cpp和头文件 cpp文件中的代码如下: #include<iostream> #include"test.h" using namespace st ...
- java前台线程和后台线程
main()函数即主函数,是一个前台线程,前台进程是程序中必须执行完成的,而后台线程则是java中所有前台结束后结束,不管有没有完成,后台线程主要用与内存分配等方面. ...
- Jenkins 部署自动化测试脚本(15)
自动化测试脚本开发完成以后,希望可以把脚本放在公共的环境下提供一个入口供大家一起使用,目前最好的解决方案就是需要把代码部署在Jenkins上,下面看下如何在Jenkins配合自动化测试任务: 1.首先 ...
- sql调优2
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...
- 把一个对象转成map对象
import java.lang.reflect.Field;import java.util.HashMap; public class Util { public static HashMap&l ...
- Getting Started with XlsxWriter
下面是一些关于使用XlsxWriter模块的简单介绍. 安装XlsxWriter 下面的是几个安装XlsxWriter模块的方法: 1.使用Pip 使用pip 方式是最推荐的从PyPi安装Python ...
- Azure CosmosDB (11) MongoDB概念
<Windows Azure Platform 系列文章目录> Azure Cosmos DB兼容MongoDB的API,下表将帮助我们更容易理解MongoDB中的一些概念: SQL概念 ...
- ubuntu设置 SSH 通过密钥对登录
1. 制作密钥对 首先在服务器上制作密钥对.登录到打算使用密钥登录的账户,然后执行以下命令: [root@host ~]$ ssh-keygen <== 建立密钥对 Generating pub ...