一、冒泡排序
1.1 概念
重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
1.2 图解
二、代码实现
2.1 java实现
import java.util.Arrays;
/**
* 优化版冒泡排序
*/
public class Test07 {
public static void main(String[] args) {
//定义一个名为value的无序数组0-9
int[] values ={3,1,6,2,9,0,7,4,8,5};
//打印排序前的数组
System.out.println("排序前,数组:"+ Arrays.toString(values));
bubbleSort(values);
//打印排序后的数组
System.out.println("排序后,数组:"+Arrays.toString(values));
}
public static void bubbleSort(int[] values){
//定义一个用于交换的中间变量
int temp;
//定义一个布尔类型变量,标记数组是否已达到有序状态
boolean flag =true;
//定义循环遍历数组values.length次每一次会取得一个最大数
for (int i=0;i<values.length-1;i++){
//内部循环取values.length-i-1次,-i是为了不访问已经排好的最大值-1是为了防止数组溢出
for (int j=0;j<values.length-i-1;j++){
//依次判断相邻两个数的值,将大的数后移
if (values[j]>values[j+1]){
temp=values[j];
values[j]=values[j+1];
values[j+1]=temp;
//flag变为false表示发生了交换
flag=false;
}
}
//判断是否发生了交换,优化冒泡排序
if (flag){
break;
}else{
flag=true;
}
}
}
}
2.2 python实现
def bubbleSort(values):
#定义循环遍历列表values.length-1次每一次会取得一个最大数
for i in range(len(values)-1):
# 定义一个布尔类型变量,标记列表是否已达到有序状态
flag = False
# 内部循环取values.length-i-1次,-i是为了不访问已经排好的最大值-1是为了防止数组溢出
for j in range(len(values)-i-1):
# 依次判断相邻两个数的值,将大的数后移
if values[j]>values[j+1]:
values[j], values[j+1]=values[j+1], values[j]
# flag变为True表示发生了交换
flag = True
# 判断是否发生了交换,优化冒泡排序
if not flag:
break
if __name__ == '__main__':
# 定义一个名为value的无序数组0-9
values = [3,1,6,2,9,0,7,4,8,5]
# 打印排序前的列表
print(f'排序前,列表:{values}')
bubbleSort(values)
# 打印排序后的列表
print(f'排序后,列表:{values}')
三、总结
如切如磋,如琢如磨
冒泡排序的优化方式还有众多,以上列举为最简单的优化。
才疏学浅,拙文一篇欢迎雅正。