每一趟都能选出一个元素放到其最终位置上,并且不稳定

每一趟都能选出一个元素放到其最终位置上,并且不稳定


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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信