优化后的python冒泡排序
需积分: 0 168 浏览量
更新于2023-10-28
收藏 13KB DOC 举报
冒泡排序是一种基础的排序算法,其主要原理是通过不断地比较相邻元素并交换位置来达到排序的目的。在Python中,冒泡排序的实现通常包括两个嵌套的循环,外层循环控制总的遍历次数,内层循环则进行相邻元素间的比较和交换。然而,原始的冒泡排序算法在处理部分有序或者完全有序的序列时效率较低,因为它总是会完成全部的n(n-1)/2次比较。
为了优化冒泡排序,我们可以引入两个关键改进:
1. **设置标志位swapped**:在每一轮遍历中,我们添加一个布尔变量`swapped`,默认值为False。如果在这一轮遍历中有元素交换,我们将`swapped`设置为True。如果一轮结束后`swapped`仍为False,说明数组已经排序完成,无需再进行后续的遍历,从而提前结束排序过程。这样可以避免对已排序的元素进行不必要的比较。
2. **减少比较次数**:在每一轮遍历时,最大的元素会被推到数列的末尾。因此,下一轮遍历时,我们可以减少比较的范围,不必再考虑已确定位置的元素。具体来说,对于长度为n的数列,在第i轮遍历中,只需要比较前n-i个元素即可。
下面是优化后的冒泡排序算法的Python实现:
```python
def bubble_sort(arr):
n = len(arr)
for i in range(n):
swapped = False
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
swapped = True
if not swapped:
break
return arr
# 测试
arr = [64, 34, 25, 12, 22, 11, 90]
print("原始数组:", arr)
sorted_arr = bubble_sort(arr)
print("排序后的数组:", sorted_arr)
```
这段代码首先获取数组的长度n,然后外层循环按i从0到n-1遍历。内层循环则在每次迭代中比较相邻元素,并在需要时交换它们的位置。如果`swapped`在一轮遍历后仍为False,就表明数组已经有序,程序提前结束。
虽然冒泡排序在最坏的情况下时间复杂度仍是O(n^2),但通过以上优化,当输入数据接近有序时,实际运行效率会显著提高。然而,对于大规模的数据,冒泡排序通常不是最佳选择,因为存在更高效的排序算法,如快速排序、归并排序和堆排序等。这些算法在平均情况下有更优的时间复杂度,能够更好地处理大数据集。在实际编程中,应根据具体需求和数据特性来选择合适的排序算法。
zero2100
- 粉丝: 172
- 资源: 2460
最新资源
- 基于Springboot的网上商城购物系统实现源码+数据库+文档(高分期末大作业)
- (25638822)图书馆管理系统(Servlet+Java+Jsp+Mysql)
- (22559438)基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)
- 机械设计LOGO检测机彩盒CCD检测设备sw18可编辑非常好的设计图纸100%好用.zip
- 基于Pyotrch开发的深度学习物体分类系统(图形化界面)高分项目源码
- Java毕设-基于Springboot的网上商城购物系统实现源码+数据库+文档
- intrinsics.h
- (173873224)05 AUTOSAR行业汽车工程师资料
- 基于S7-200 PLC和组态王大小球大小分拣
- (179461246)MATLAB代码:电-气-热综合能源系统耦合优化调度 关键词:综合能源系统 优化调度 电气热耦合 仿真平台:MATLAB Y
- Kinect v2 Examples with MS-SDK 2.23
- (177300606)软件工程:概要设计说明书
- (177196812)VBA实现合并相同单元格
- (174331414)VBA实现格式相同的excel文件汇总合并
- 封装 axios 拦截器实现用户无感刷新 access-token
- 燃料电池仿真模型燃料电池仿真模型,本模型基于Cruise软件和 Simulink软件共同搭建完成,并基于实际项目搭建,本资料包包含所有源文件