冒泡排序
冒泡排序发是把N个数通过 N - 1 轮排序,升序排序中大的数往下沉,小的数往上浮。每一轮比较会把最大的数下沉到最底,所以相互比较的次数每一轮都会比前一轮少一次。
冒泡排序代码实现:
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] nums = new int[]{9, 5, 3, 4, 10, 6, 2, 7, 8, 1};
System.out.println("排序前:" + Arrays.toString(nums));
nums = sort(nums);
System.out.println("排序后:" + Arrays.toString(nums));
}
public static int[] sort(int[] nums){
int n = nums.length;
for (int i = 0;i < n - 1;i++){ // n-1次 (第n次不用比较)
for (int j = 0;j < n - 1 - i;j++){ // n-1-i次 每一轮都比上一次少比较一次
if (nums[j] > nums[j + 1]){ // 比较大小
int tmp = nums[j]; // 互换位置
nums[j] = nums[j + 1];
nums[j + 1] = tmp;
}
}
}
return nums;
}
}
优化:添加一个 flag 表示每一轮是否交换的标志,每轮的开始设置为 false,若本轮有交换过位置则修改 flag 为 true,若本轮 flag 还是等于 false 说明没有进行交换,数组已经有序了,跳出循环。
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] nums = new int[]{9, 5, 3, 4, 10, 6, 2, 7, 8, 1};
System.out.println("排序前:" + Arrays.toString(nums));
nums = sort(nums);
System.out.println("排序后:" + Arrays.toString(nums));
}
public static int[] sort(int[] nums){
boolean flag; // 是否交换的标志
int n = nums.length;
for (int i = 0;i < n - 1;i++){ // n-1次 (第n次不用比较)
flag = false;
for (int j = 0;j < n - 1 - i;j++){ // n-1-i次 每一轮都比上一次少比较一次
if (nums[j] > nums[j + 1]){ // 比较大小
int tmp = nums[j]; // 互换位置
nums[j] = nums[j + 1];
nums[j + 1] = tmp;
flag = true; // 只要有发生交换就改为true
}
}
if (!flag) // 若为false说明已经有序了,跳出循环
break;
}
return nums;
}
}
用一个基本有序的数组查看优化前后的比较次数,明显优化后的比较次数少了不少。
优化前:
优化后: