目录
介绍
冒泡排序,顾名思义就是排序数据像冒泡一样,在排序过程中从前到后,依次比较数据的大小,在每一轮中把最小或者最大的数依次放在最后,倒数第二.........直到完成排序
思路
冒泡排序就是从待排序的数组中第一个数据开始和第二个数据比较,大的放后面 然后在用第二个(较大的那一个)与第三个数据比较,大的放后面,直到最后一个数据,此时第一轮排序就完成了, 现在数组中元素最后一个就是原数组中最大的数据 第二轮就是确定第二大的数据,放在数组的倒数第二个位置,依次确认,直到排序完成 内层循环确定每一轮最大的数,循环次数为array.length - 1 - i,外层循环确定进行几轮排序,循环次数为array.length - 1
推导过程
我们把问题从简单到复杂编写程序,先写出每一轮内层循环的代码
第一轮排序
public static void BubbleSort1(int[] array) {
//第一轮排序,确定原数组中最大的数
int temp = 0;//定义一个辅助变量方便交换
for (int j = 0; j < array.length - 1; j++) {
if (array[j] > array[j + 1]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
第二轮排序
public static void BubbleSort2(int[] array) {
//第二轮排序,确定原数组中第二大的数
int temp = 0;//定义一个辅助变量方便交换
for (int j = 0; j < array.length - 1 - 1; j++) {
if (array[j] > array[j + 1]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
第三轮排序
public static void BubbleSort3(int[] array) {
//第三轮排序,确定原数组中第二大的数
int temp = 0;//定义一个辅助变量方便交换
for (int j = 0; j < array.length - 1 - 2; j++) {
if (array[j] > array[j + 1]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
根据上面的三轮排序,我们可以找到规律,从而写出冒泡排序的代码
冒泡排序代码
//由此我们可以得出冒泡排序算法
public static void BubbleSort(int[] array) {
//思路分析:冒泡排序就是从待排序的数组中第一个数据开始和第二个数据比较,大的放后面
//然后在用第二个(较大的那一个)与第三个数据比较,大的放后面,直到最后一个数据,此时第一轮排序就完成了,
//现在数组中元素最后一个就是原数组中最大的数据
//第二轮就是确定第二大的数据,放在数组的倒数第二个位置,依次确认,直到排序完成
//内层循环确定每一轮最大的数,循环次数为array.length - 1 - j,外层循环确定进行几轮排序,循环次数为array.length - 1
//我们把问题从简单到复杂编写程序,先写出每一轮内层循环的代码
//第二轮排序,确定原数组中第二大的数
//冒泡排序的优化,有的时候我们进行排序,可能不需要那么多轮就排好了,可能在第一轮或者第二轮就排好了
//但是这个代码是不管有没有排好,都会进到内层for循环的判断语句中去,即每一轮,每两个相邻的数都会进行判断,
//由此我们可以对这段代码进行优化,
//优化思路如下:
//我们可以设置一个boolean类型的标志变量,当内层for循环里面没有发生任何交换的时候
// (这时候任意两个相邻的值都满足,后一个大于前一个,即完成从小到大排序),
// 改变标志变量的值来提前退出冒泡排序
int temp = 0;//定义一个辅助变量方便交换
boolean flag = false;// 标识变量,表示是否进行过交换
for (int i = 0; i < array.length - 1 ; i++) {
for (int j = 0; j < array.length - 1 - i; j++) {
if (array[j] > array[j + 1]) {
flag = true;
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
System.out.println("第" + (i + 1) + "趟排序后的数组" + Arrays.toString(array));
if (!flag){// 在一趟排序中,一次交换都没有发生过
break;
}else {
flag = false;// 重置flag, 进行下次判断
}
}
}
其中,加入了冒泡排序的优化,和优化的思路分析,如上