冒泡排序的基本思想是对相邻的元素进行两两比较,然后根据需要进行位置交换,每一轮比较结束都会把最小值或者最大值放到末端。
最好的情况就是整个顺序完全符合要求,最坏的情况是整个顺序相对于预期是倒叙的,为了能够满足所有情况下的排序,在确定排序轮数时应该按照最坏的情况处理,假如有n个数,那么就需要进行n-1(如果n-1个数的位置都确定了,那么第n个也就确定了,所以只需要n-1次即可,不需要n次)轮排序,下面举例说明。
对2, 5, 8, 3, 9, 6这几个数进行降序排列:
分析:上面的数列中一共有6个元素,所以排序轮数最多是5次,每一次排序结束都会把当前最小的值放到参与排序的元素的最后面。
第一轮
排序结果为:5, 8, 3, 9, 6, 2
本轮排序需要参与两两比较的元素是6个,即需要两两比较5次(也表示在代码实现中需要循环5次),最终排序结束后会将参与排序的最小值2浮动到最末端。第二轮
排序结果为:8, 5, 9, 6, 3, 2
由于在第一轮排序中最小值2已经被完全确定了位置,所以到本轮排序需要参与两两比较的元素是5个(2不参与了),即需要两两比较4次(也表示在代码实现中需要循环4次),最终排序结束后会将参与排序的最小值3浮动到倒数第二末端位置。第三轮
排序结果为:8, 9, 6, 5, 3, 2
由于在前两轮排序中最小值2、3已经被完全确定了位置,所以到本轮排序需要参与两两比较的元素是4个(2,3不参与了),即需要两两比较3次(也表示在代码实现中需要循环3次),最终排序结束后会将参与排序的最小值5浮动到倒数第三末端位置。第四轮
排序结果为:9, 8, 6, 5, 3, 2
由于在前三轮排序中最小值2、3,5已经被完全确定了位置,所以到本轮排序需要参与两两比较的元素是3个(2,3,5不参与了),即需要两两比较2次(也表示在代码实现中需要循环2次),最终排序结束后会将参与排序的最小值6浮动到倒数第四末端位置。
从上面的分析可知,一共进行了4轮排序就排序完成了,但是为了考虑算法的通用性,需要设置该排序的轮数为5(即外层循环的循环次数为5)。每次排序结束都会确定一个数的位置,而这个数就没有必要参与下一轮排序了,所以每一轮排序中相较于上一轮来说两两比较的执行次数是不断在减少的(每排序一次就减1),也就是说控制两两比较的内层循环的循环次数是递减的。
排序算法的具体代码实现如下:
/**
* 冒泡排序代码实现
*/
public static void bubbleSort() {
//要排序的数组
int[] array = {2, 5, 8, 3, 9, 6};
//外循环控制排序的轮数
for (int i = 0; i < array.length - 1; i++) {
//内循环进行两两比较和位置交换
for (int j = 0; j < array.length - i - 1; j++) {
if (array[j] < array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
//输出排序结果
for (int k = 0; k < array.length; k++) {
System.out.print(array[k] + " ");
}
}
打印结果为:9 8 6 5 3 2 ,如果要升序排序只需要将换位置的条件改为大于号即可。
本文详细解析了冒泡排序算法的工作原理,通过实例演示了如何对一组数字进行降序排列,展示了算法的每一步操作,包括轮数设定和两两比较过程,并提供了具体的代码实现。
18万+

被折叠的 条评论
为什么被折叠?



