活动地址:CSDN21天学习挑战赛
冒泡排序
基本原理
对存放原始数据的数组,按从前往后的方向进行多次扫描,每次扫描称为一趟。当
发现相邻两个数据的次序与排序要求的大小次序不符合时,即将这两个数据进行互换。
如果从小到大排序,这时,较小的数据就会逐个向前移动,好像气泡向上漂浮一样,故称为冒泡排序。
- 为什么每一轮泡泡相互比较的次数都减少了一次?
对于升序冒泡排序而言
第一轮循环的结果:把最大的数换到最后一个位置
第二轮循环的结果:把第二大的数换到倒数第二个位置
。。。依次类推
所以每经过一轮循环,就可以少比较一个数,故此每经过一轮循环,就会减少一次比较。
- 如果有n个数需要排序,那么需要几轮排序?
答:最多需要经过n-1轮排序,因为每轮冒泡只冒一个当前轮的最大数,所以在极端情况下,就需要n-1次循环。如果不是极端情况,有可能在前面的某一轮循环中,所有的数字就已经刚好是排好序了。
图示以及代码示例
package tenSort;
/*
* 冒泡排序
* 比较交换相邻元素
* 思路简单,仅学习用
*/
public class Bubble {
private static void sort(int[] nums) {
int n = nums.length;
for (int i = 0; i < n - 1; i++) { // i表示(末尾)排序完成的个数
for (int j = 0; j < n - i - 1; j++) { // 注意j和j+1比,所以n-i(减i表示减去已经排好序的)后再-1
if (nums[j] > nums[j + 1]) { // 比较交换,这里如果把 > 换成 < ,就会变成降序排序
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
}
// 测试代码
public static void main(String[] args) {
int[] nums = new int[]{11,3,19,6,1};
sort(nums);
for (int num : nums)
System.out.print(num + " ");
}
}