2024年5月2日发(作者:)
每一趟都能选出一个元素放到其最终位置上,并且不稳定
冒泡排序:每一趟能选出一个元素放到其最终位置上,并且不稳定
----------------------------------
冒泡排序是一种比较简单的排序算法,它的基本思想是:通过重复地走访过要排序的数列,一次比
较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需
要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢
“浮”到数列的顶端。
## 一、冒泡排序的原理
冒泡排序是一种交换排序,它的工作原理如下:
1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个;
2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是
最大的数;
3. 针对所有的元素重复以上的步骤,除了最后一个;
4. 重复步骤1~3,直到排序完成。
## 二、冒泡排序的实现方式
冒泡排序可以有多种实现方式,其中常用的有三种:
1. 普通冒泡排序
2. 改进冒泡排序
3. 快速冒泡排序
### 1. 普通冒泡排序
冒泡排序最早发明是在1956年,由两位数学家F. W. Watson和A.M. Sorton发明。它是一种简单
而原始的排序方式,它采用相邻元素两两对比的方式,如果前者大于后者,就将两者交换位置,直
到整个数列都有序为止。它的基本原理如上文所述,具体实现代码如下所示:
```python
def bubble_sort(list):
# 获取list的长度
length = len(list)
# 外层循环表示总共要循环length-1轮
for i in range(length-1):
# 内层循环表示每一轮要循环length-i-1次
for j in range(length-i-1):
if list[j] > list[j+1]:
list[j], list[j+1] = list[j+1], list[j]
```
### 2. 改进冒泡排序
在原始的冒泡排序中,如果待排序数列中存在大量已经有序的数列时,冒泡排序依然会执行大量的
无用功,而“改进冒泡排序”就是为了解决这一问题而出现的。它在原来的冒泡排序中加入了一个标
志位flag,当在一轮循环中元素都未发生交换时,说明该数列已经有序,此时就可以直接退出循环。
具体实现代码如下所示:
```python
def bubble_sort_improved(list):
length = len(list)
# 外层循环表示总共要循环length-1轮
for i in range(length-1):
# 内层循环表示每一轮要循环length-i-1次
for j in range(length-i-1):
flag = 0 # 加入标志位flag
if list[j] > list[j+1]:
list[j], list[j+1] = list[j+1], list[j]
flag = 1 # 如发生交换则将flag=1
if flag == 0: # 如flag仍为0,则说明已有序,可退出循环
break # 跳出当前循环
```
### 3. 快速冒泡排序
快速冒泡排序是在原来的冒泡排序上进行了一些优化,它使用了双向扫描方式来避免多余的交换。
它采用从前向后和从后向前各扫一遍的方式来实现快速冒泡,当扫完一遍后,发生了交换,再以此
扫完另一遍。具体实现代码如下所示:
```python
def quick_bubble_sort(list):
length = len(list) # 获取list的长度
# 定义“正向”扫描时的边界
low = 0 # low表示正向扫描时已扫边界外元素的下标
# 定义“反向”扫描时的边界
high = length - 1 # high表示反向扫描时已扫边界外元素的下标
flag = True # 设定flag标志位
while low < high and flag: # low flag = False # 每轮循环前将flag重新设为false # “正向”扫描 for i in range(low, high): # 正向扫描时low~high-1轮 if list[i] > list[i+1]: # 如发生逆序则交换 list[i], list[i+1] = list[i+1], list[i] # 交换 flag = True # 并将flag=true,表明本轮发生过交换 high -= 1 # 正向扫完一遍后,high减1 # “反向”扫描 for j in range(high, low, -1): # 反向扫描时high~low+1轮 if list[j] < list[j-1]: # 如发生逆序则交换 list[j], list[j-1] = list[j-1], list[j] # 交换 flag = True # 并将flag=true,表明本轮发生过交换 low += 1 # 反向扫完一遍后,low加1 return list # 返回list ``` ## 三、冒泡排序的优劣势分析 ### 1. 优势 1. 冒泡排序是一种原始而直观的排序方式; 2. 冒泡排序在处理少量数字时效率很高; 3. 冒泡排序对于已经有序或者部分有序的数列效率也很高。 ### 2. 劣势 1. 冒泡排序处理大量数字时效率很低; 2. 冒泡排序在处理大量数字时耗费大量内存。 通过以上分析可以看出,当处理少量数字时冒泡排序是一个不错的选择;而当处理大量数字时则 不太适用。因此在使用时要根据实际情况来选用不同的方式来实现。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1714608973a2479742.html
评论列表(0条)