下面首先介绍冒泡排序的基本思想,其次用Java实现冒泡排序,实现将数组元素从小到大排列。
一、冒泡排序的基本思想
1、第一轮从数组的第一个数开始,相邻的两个数之间进行比较,如果左边的数比右边大,则两个数交换顺序,否则不交换顺序;下面从数组的第二个数开始,相邻的两个数之间进行同样的比较,直到倒数第二个数和最后一个数比较完,第一轮交换结束。
经过第一轮交换,数组最大的数在数组的最后一个位置。
2、第二轮从第一个数开始,一直到倒数第二个数,以相同的方式进行交换。
3、冒泡排序的终止条件:当该轮排序没有数字之间的交换,说明该数组已经完全有序,此时冒泡排序结束。
二、冒泡排序的时间复杂度
1、数字的比较:第一轮需要n - 1次数字的比较,第二轮需要n - 2次数字的比较,以此类推,第n - 1轮需要1次数字之间的比较。
2、元素的交换:每次交换需要执行3条语句。
比如需要排序的数组为arr,arr[j + 1]和arr[j]进行交换,则要执行以下三条语句:
// An highlighted block
int temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
3、时间复杂度为:
三、冒泡排序的空间复杂度
由于整个过程只需要在数组相邻两个数交换的时候引入一个临时变量temp,因此空间复杂度为 。
四、冒泡排序是稳定的
if(arr[j + 1] < arr[j]) {
//数组相邻两个数字之间后一个比前一个小,则交换两个数的位置,并将loopFlag变为true
int temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
loopFlag = true;
}
当数组中出现两个相等的数进行交换顺序时,不满足 ,相等的两个数不会进行交换,其相对位置保持不变,因此冒泡排序是稳定的。
五、用Java实现冒泡排序
public static void main(String[] args) {
//排序前的数组
int[] arr = {49, 38, 65, 97, 76, 13, 27, 49};
for(int i = 0; i < arr.length - 1; i++) {
boolean loopFlag = false; //假设每次冒泡排序过程中,不发生相邻数字顺序的交换
//每轮排序会将第i + 1大的数字放在数组的第arr.length - i位,比如当i = 0时,最大的数字放在数组的最后
for(int j = 0; j < arr.length - 1 - i; j++) {
if(arr[j + 1] < arr[j]) {
//数组相邻两个数字之间后一个比前一个小,则交换两个数的位置,并将loopFlag变为true
int temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
loopFlag = true;
}
}
//此轮排序没有相邻数字的交换,说明该数组已经有序,冒泡排序结束!
if(!loopFlag) {
break;
}
}
System.out.println("排序后的数组为:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
//输出结果为13 27 38 49 49 65 76 97
}
}
来源:CSDN
作者:plstgt
链接:https://blog.csdn.net/qq_20519927/article/details/104137204