【排序算法】冒泡排序,选择排序,插入排序算法原理及Python代码实现

导读:本篇文章讲解 【排序算法】冒泡排序,选择排序,插入排序算法原理及Python代码实现,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

我是一个甜甜的大橙子🍊,欢迎关注✉️!
我相信技术的力量💪
努力将所学分享给大家😎
你的点赞❤️分享🚀收藏📖就是对我最大的鼓励👏!

1.冒泡排序

1.1算法原理

从第一个元素开始,比较相邻元素的大小,如果大小顺序有误,则对调之后再进行下一个元素比较,经过这样不断交换之后,就可以找出最后一个元素的正确位置。接着再逐步进行交换,直到完成所有数据的排序关系为止。过程示意如下图:
在这里插入图片描述

  • 优点:算法简单直接
  • 缺点:算法复杂度为O(n2)

1.2Python代码实现

def bubble_sort(lst):
	for i in range(len(lst)-1,0,-1):
		for j in range(i):
			if lst[j] > lst[j+1]:
				lst[j],lst[j+1] = lst[j+1],lst[j] # use tuple assignment

2.选择排序

2.1算法原理

第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。过程示意如下图:
在这里插入图片描述

时间复杂度
选择排序的交换操作介于 0 和 (n – 1)次之间。选择排序的比较操作为 n (n – 1) / 2 次之间。选择排序的赋值操作介于 0 和 3 (n – 1) 次之间。比较次数O(n2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+…+1=n*(n-1)/2。交换次数O(n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快
稳定性
选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。

  • 优点:比冒泡排序执行更少的交换
  • 缺点:最好最差的算法复杂度均为O(n2),算法不稳定

2.2Python代码实现

def selection_sort(lst):
	for fillslot in range(len(lst)-1,0,-1):
		position_of_max = 0
		for location in range(1,fillslot+1):
			if lst[location] > lst[position_of_max]:
				position_of_max = location
		lst[fillslot],lst[position_of_max] = lst[position_of_max],lst[fillslot]

3.插入排序

3.1算法原理

插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。过程示意如下图:
在这里插入图片描述

时间复杂度
在插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较N- 1次,时间复杂度为O(N)。
最坏的情况是待排序数组是逆序的,此时需要比较次数最多,总次数记为:1+2+3+…+N-1,所以,插入排序最坏情况下的时间复杂度为O(n2)。
平均来说,A[1…j-1]中的一半元素小于A[j],一半元素大于A[j]。插入排序在平均情况运行时间与最坏情况运行时间一样,是输入规模的二次函数。

  • 优点:比冒泡排序执行更少的交换,算法稳定
  • 缺点:算法复杂度为O(n2)

3.2Python代码实现

def insertion_sort(lst):
	for insert_num in range(1,len(lst)):
		position = insert_num - 1
		while lst[insert_num] < lst[position] and position >= 0:
			lst[position],lst[insert_num] = lst[insert_num],lst[position]
			insert_num -= 1
			position -= 1

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/63032.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!