⑴ 冒泡排序与选择排序的比较(python实现)
通过学习排序算法,发现冒泡排序和选择排序在算法实现上,十分的近似,下面进行必要的一些讲解:
让数组当中相邻的两个数进行比较, 数组当中比较小的数值向下沉,数值比较大的向上浮!外层for循环控制循环次数,内层for循环控制相邻的两个元素进行比较。
将一个序列分为两部分, 前面是有序序列,后面是无序序列,不断的将后面的无序序列中的最小值添加到前面的有序序列中,直到后面的无序序列中没有值,开始的时候将第一个值作为有序序列。
由于冒泡排序中元素需要两两比较,所以要 遍历 所有元素, 冒牌排序算法,非常适用于寻找列表中最大值或者,最小值 。
在选择排序中,我们也需要一轮轮的选出剩余的无需元素中的最小值,所以也要一次次的遍历无序列表, 非常契合的使用冒泡的思想去选出最小值 。
【结论】:看这两个算法其实思维不同,但是实现的编码过程十分一致。如果看程序看蒙了,其实也不要紧,思维上能明白两者的区别就行...
⑵ 璋佽兘璁蹭竴涓嫔啋娉℃帓搴忓师鐞
鍐掓场鎺掑簭绠楁硶镄勫师鐞嗗备笅锛
1锛屾瘆杈幂浉闾荤殑鍏幂礌銆傚傛灉绗涓涓姣旂浜屼釜澶э纴灏变氦鎹浠栦滑涓や釜銆
2锛屽规疮涓瀵圭浉闾诲厓绱犲仛钖屾牱镄勫伐浣滐纴浠庡紑濮嬬涓瀵瑰埌缁揿熬镄勬渶钖庝竴瀵广傚湪杩欎竴镣癸纴链钖庣殑鍏幂礌搴旇ヤ细鏄链澶х殑鏁般
3锛岄拡瀵规墍链夌殑鍏幂礌閲嶅崭互涓婄殑姝ラわ纴闄や简链钖庝竴涓銆
4锛屾寔缁姣忔″硅秺𨱒ヨ秺灏戠殑鍏幂礌閲嶅崭笂闱㈢殑姝ラわ纴鐩村埌娌℃湁浠讳綍涓瀵规暟瀛楅渶瑕佹瘆杈冦
銆
2锛岀畻娉旷ǔ瀹氭э细
鍐掓场鎺掑簭灏辨槸鎶婂皬镄勫厓绱犲线鍓嶈皟鎴栬呮妸澶х殑鍏幂礌寰钖庤皟銆傛瘆杈冩槸鐩搁偦镄勪袱涓鍏幂礌姣旇缉锛屼氦鎹涔熷彂鐢熷湪杩欎袱涓鍏幂礌涔嬮棿銆
镓浠ワ纴濡傛灉涓や釜鍏幂礌鐩哥瓑锛屾槸涓崭细鍐崭氦鎹㈢殑锛涘傛灉涓や釜鐩哥瓑镄勫厓绱犳病链夌浉闾伙纴闾d箞鍗充娇阃氲繃鍓嶉溃镄勪袱涓や氦鎹㈡妸涓や釜鐩搁偦璧锋潵锛岃繖镞跺欎篃涓崭细浜ゆ崲锛屾墍浠ョ浉钖屽厓绱犵殑鍓嶅悗椤哄簭骞舵病链夋敼鍙桡纴镓浠ュ啋娉℃帓搴忔槸涓绉岖ǔ瀹氭帓搴忕畻娉曘
鍙傝冭祫鏂欙细锏惧害锏剧----鍐掓场鎺掑簭
⑶ 鍐掓场鎺掑簭镄勪腑蹇冩濇兂鏄浠涔堬纻
鍐掓场鎺掑簭镄勪腑蹇冩濇兂鏄锛氢粠镞犲簭搴忓垪澶撮儴寮濮嬶纴杩涜屼袱涓ゆ瘆杈冿纴镙规嵁澶у皬浜ゆ崲浣岖疆锛岀洿鍒版渶钖庡皢链澶э纸灏忥级镄勬暟鎹鍏幂礌浜ゆ崲鍒颁简镞犲簭阒熷垪镄勯槦灏撅纴浠庤屾垚涓烘湁搴忓簭鍒楃殑涓閮ㄥ垎锛涗笅涓娆$户缁杩欎釜杩囩▼锛岀洿鍒版墍链夋暟鎹鍏幂礌閮芥帓濂藉簭銆傜畻娉旷殑镙稿绩鍦ㄤ簬姣忔¢氲繃涓や袱姣旇缉浜ゆ崲浣岖疆锛岄夊嚭鍓╀綑镞犲簭搴忓垪閲屾渶澶э纸灏忥级镄勬暟鎹鍏幂礌鏀惧埌阒熷熬銆
⑷ 八大经典排序算法原理及实现
该系列文章主要是记录下自己暑假这段时间的学习笔记,暑期也在实习,抽空学了很多,每个方面的知识我都会另起一篇博客去记录,每篇头部主要是另起博客的链接。
冒泡排序算法应该是大家第一个接触的算法,其原理都应该懂,但我还是想以自己的语言来叙述下其步奏:
按照计算时间复杂度的规则,去掉常数、去掉最高项系数,其复杂度为O(N^2)
冒泡排序及其复杂度分析
空间复杂度就是在交换元素时那个临时变量所占的内存
给定一个整数序列{6,1,2,3,4},每完成一次外层循环的结果为:
我们发现第一次外层循环之后就排序成功了,但是还是会继续循环下去,造成了不必要的时间复杂度,怎么优化?
冒泡排序都是相邻元素的比较,当相邻元素相等时并不会交换,因此冒泡排序算法是稳定性算法
插入排序是对冒泡排序的一种改进
插入排序的思想是数组是部分有序的,再将无序的部分插入有序的部分中去,如图:
(图片来自 这里 )
空间复杂度就是在交换元素时那个临时变量所占的内存
插入排序的优化,有两种方案:
文章后面会给出这两种排序算法
由于插入排序也是相邻元素的比较,遇到相等的相邻元素时不会发生交换,也不会造成相等元素之间的相对位置发生变化
其原理是从未排序的元素中选出最小值(最大值)放在已排序元素的后面
空间复杂度就是在交换元素时那个临时变量所占的内存
选择排序是不稳定的,比如 3 6 3 2 4,第一次外层循环中就会交换第一个元素3和第四个元素2,那么就会导致原序列的两个3的相对位置发生变化
希尔排序算是改良版的插入排序算法,所以也称为希尔插入排序算法
其原理是将序列分割成若干子序列(由相隔某个 增量 的元素组成的),分别进行直接插入排序;接着依次缩小增量继续进行排序,待整个序列基本有序时,再对全体元素进行插入排序,我们知道当序列基本有序时使用直接插入排序的效率很高。
上述描述只是其原理,真正的实现可以按下述步奏来:
希尔排序的效率取决于 增量值gap 的选取,这涉及到数学上尚未解决的难题,但是某些序列中复杂度可以为O(N 1.3),当然最好肯定是O(N),最坏是O(N 2)
空间复杂度就是在交换元素时那个临时变量所占的内存
希尔排序并不只是相邻元素的比较,有许多跳跃式的比较,难免会出现相同元素之间的相对位置发生变化,所以希尔排序是不稳定的
理解堆排序,就必须得先知道什么是堆?
二叉树的特点:
当父节点的值总是大于子结点时为 最大堆 ;反之为 最小堆 ,下图就为一个二叉堆
一般用数组来表示堆,下标为 i 的结点的父结点下标为(i-1)/2;其左右子结点分别为 (2 i + 1)、(2 i + 2)
怎么将给定的数组序列按照堆的性质,调整为堆?
这里以建立最小堆为示例,
很明显对于其叶子结点来说,已经是一个合法的子堆,所以做堆调整时,子节点没有必要进行,这里只需从结点为A[4] = 50的结点开始做堆调整,即从(n/2 - 1)位置处向上开始做堆调整:
由于每次重新恢复堆的时间复杂度为O(logN),共N - 1次重新恢复堆操作,再加上前面建立堆时N / 2次向下调整,每次调整时间复杂度也为O(logN),二次操作时间相加还是O(N logN)。故堆排序的时间复杂度为O(N * logN)。
空间复杂度就是在交换元素时那个临时变量所占的内存
由于堆排序也是跨越式的交换数据,会导致相同元素之间的相对位置发生变化,则算法不稳定。比如 5 5 5 ,堆化数组后将堆顶元素5与堆尾元素5交换,使得第一个5和第三个5的相对位置发生变化
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
快速排序在应该是大家经常看到、听到的算法,但是真正默写出来是有难度的。希望大家看了下面 挖坑填数 方法后,能快速写出、快速排序。
其原理就这么几句话,但是现实起来并不是这么简单,我们采取流行的一种方式 挖坑填数分治法
对于序列: 72 6 57 88 60 42 83 73 48 85
数组变为: 48 6 57 88 60 42 83 73 88 85
再重复上面的步骤,先从后向前找,再从前向后找:
数组变为: 48 6 57 42 60 72 83 73 88 85
可以看出a[5]前面的数字都小于它,a[5]后面的数字都大于它。因此再对a[0…4]和a[6…9]这二个子区间重复上述步骤就可以了
空间复杂度,主要是递归造成的栈空间的使用:
快速排序的优化主要在于基准数的选取
快速排序也是跨越式比较及交换数据,易导致相同元素之间的相对位置发生变化,所以快速排序不稳定
前面也说了二分查找排序是改进的插入排序,不同之处在于,在有序区间查找新元素插入位置时,为了减少比较次数提高效率,采用二分查找算法进行插入位置的确定
具体步骤,设数组为a[0…n]:
二分查找插入位置,因为不是查找相等值,而是基于比较查插入合适的位置,所以必须查到最后一个元素才知道插入位置。
二分查找最坏时间复杂度:当2^X>=n时,查询结束,所以查询的次数就为x,而x等于log2n(以2为底,n的对数)。即O(log2n)
所以,二分查找排序比较次数为:x=log2n
二分查找插入排序耗时的操作有:比较 + 后移赋值。时间复杂度如下:
二分查找排序在交换数据时时进行移动,当遇到有相等值插入时也只会插入其后面,不会影响其相等元素之间的相对位置,所以是稳定的
白话经典算法排序
冒泡排序选择排序
快速排序复杂度分析
优化的插入排序
⑸ Python冒泡排序注意要点实例详解
Python冒泡排序注意要点实例详解
文给大家介绍了python冒泡排序知识,涉及到冒泡排序主要的细节问题,本文通过实例代码给大家讲解,介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看看吧
冒泡排序注意三点:
1. 第一层循环可不用循环所有元素。
2.两层循环变量与第一层的循环变量相关联。
3.第二层循环,最终必须循环集合内所有元素。
示例代码一:
1.第一层循环,只循环n-1个元素。
2.当第一层循环变量为n-1时,第二层循环所有元素。
s = [3, 4, 1, 6, 2, 9, 7, 0, 8, 5]
# bubble_sort
for i in range(0, len(s) - 1):
for j in range(i + 1, 0, -1):
if s[j] < s[j - 1]:
s[j], s[j - 1] = s[j - 1], s[j]
for m in range(0, len(s)):
print(s[m])
示例代码二:
1.第一层循环所有元素。
2.第二层也循环所有元素。
s = [3, 4, 1, 6, 2, 9, 7, 0, 8, 5]
for i in range(0, len(s)):
for j in range(i, 0, -1):
if s[j] < s[j - 1]:
s[j], s[j - 1] = s[j - 1], s[j]
for m in range(0, len(s)):
print(s[m])
以上所述是小编给大家介绍的python冒泡排序算法注意要点,希望对大家有所帮助