1. 排序思路
- 共进行 length - 1 次 “大循环”
- 每趟循环,排序的次数逐次减少
- 每躺排序,两两比较大小,每次比较都把大的后移
- (优化)若某躺大循环中,没有发生“交换”,则结束整个排序
2. 代码实现
/**
* 冒泡排序
* - 共进行 length - 1 次 “大循环”
* - 每趟循环,排序的次数逐次减少
* - 每躺排序,两两比较大小,每次比较都把大的后移
* -(优化)若某躺大循环中,没有发生“交换”,则结束整个排序
* @param originalArray - 原始数组
* @return - 排序后数组(不改变原始数组)
*/
public static int[] bubbleSort(int[] originalArray) {
// 1. 新建数组,将参数数组复制
int[] sortedArray = new int[originalArray.length];
for (int i = 0; i < originalArray.length; i++) {
sortedArray[i] = originalArray[i];
}
// 2. 大循环 (length - 1) 次,每次循环都寻找"未排序数组中"的"最大数,将其放到该数组末尾
for (int i = 0; i < sortedArray.length - 1; i++) {
// 1.1 设置boolean变量hasExchange,用来判断是否有交换
boolean hasExchange = false;
// 1.2 小循环 未排序数组长度 - 1 次,每次循环都比较两个相邻的数,大数后移。
// 未排序数组长度 = 上次大循环数组长度 - 1
for (int j = 0; j < sortedArray.length - 1 - i; j++) {
// 1.2.1 若 当前数 > 后一个数:交换
if (sortedArray[j] > sortedArray[j + 1]) {
// (1) 需要交换,故设置 hasExchange 为 true
hasExchange = true;
// (2) 设置int临时变量,用来交换
int tempCurrent = 0;
// (3) 交换
tempCurrent = sortedArray[j];
sortedArray[j] = sortedArray[j + 1];
sortedArray[j + 1] = tempCurrent;
}
}
// 1.3 若这次大循环没有交换,结束整个循环,排序结束
if (!hasExchange) {
break;
}
}
// 3. 返回排好序的数组
return sortedArray;
}