Java数组的冒泡排序
冒泡排序
思想:每次比较相邻的两个数,若逆序则交换,直到数组有序为止。
首先,我们来过一遍冒泡排序,图解如下:
可以发现六个数组元素,五趟就可以排好序,即就是nums.length-1趟循环,在每一趟排序中,每次可排元素每趟都减少一个,观察他的规律就是nums.length-1-i。我们知道冒泡排序就是将最大的元素放在最后一位,那么我们在控制外层循环时就不用再考虑最后一位的比较。
public class BubbleSort {
/*
冒泡排序即就是每次将相邻的两个元素进行比较,
如果逆序则交换,直到数组元素有序
*/
public void sort1(int[] nums){
//控制排序次数 冒泡排序会将最大的一位放在最后,所以最后一位不用再比较
for (int i = 0; i < nums.length-1; i++) {
for (int j = 0; j < nums.length-1-i; j++) {
if (nums[j] > nums[j+1]) {
int temp = nums[j+1];
nums[j+1] = nums[j];
nums[j] = temp;
}
}
}
System.out.println("第"+(i+1)+"趟冒泡排序:");
System.out.println( Arrays.toString(nums));
}
public static void main(String[] args) {
int[] nums = {3,2,1,4,5};
BubbleSort b = new BubbleSort();
b.sort1(nums);
}
}
从上面图解可以看出,我们的程序重复走了很多并没有交换的趟数,所以我们可以针对这一点对代码进行优化。加一个标记变量Boolean flag来表示它是否进行过交换,代码优化如下:
public class BubbleSort {
/**
优化版减少元素比较的次数
*/
public void sort2(int[] nums) {
//加一个标记变量,表示是否进行过交换
boolean flag = false;
for (int i = 0; i < nums.length-1; i++) {
for (int j = 0; j < nums.length-1-i; j++) {
if (nums[j] > nums[j+1]) {
flag = true;//true为交换
int temp = nums[j+1];
nums[j+1] = nums[j];
nums[j] = temp;
}
}
if(!flag){//如果在一次循环排序中,一次交换都没有发生
break;
}else {
flag = false;//重置flag进行下一次判断
}
System.out.println("第"+(i+1)+"趟冒泡排序:");
System.out.println( Arrays.toString(nums));
}
}
public static void main(String[] args) {
int[] nums = {3,2,1,4,5};
BubbleSort b = new BubbleSort();
b.sort2(nums);
}
}
在优化代码执行完后,我们可以明显的看出趟数减少了,这就是它的优化版代码。