冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素为止,这意味着数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(或说是排序的开头位置),就如同水中的气泡一样上升到水面。
冒泡排序的写法可以简单分为两种方式,分别是:前同后异、前异后同
写法1:前同后异
前同就是指:for循环中的变量i和j都是从零开始
后异就是指:for循环的判断条件i为n - 1,j为n - i - 1
public static void bubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) { // 外层循环,控制排序的轮数
for (int j = 0; j < n - i - 1; j++) { // 内层循环,进行相邻元素的比较和交换
// 比较相邻元素,如果顺序错误则交换
if (arr[j] > arr[j + 1]) {
// 交换arr[j]和arr[j+1]
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
写法2:前异后同
前异就是指:for循环中的变量i为0, j为i + 1
后异就是指:for循环的判断条件i和j为n - 1
public static void bubbleSortVariant(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) { // 外层循环,控制排序的轮数
for (int j = i + 1; j < n - 1; j++) { // 内层循环,从i+1开始,并确保不会越界
// 比较相邻元素,如果顺序错误则交换
if (arr[j] > arr[j + 1]) {
// 交换arr[j]和arr[j+1]
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
// 注意:这里没有处理j=n-2时与arr[n-1]的比较,
// 因为在下一轮外层循环中,i将增加到n-2,然后j将从n-1开始(但内层循环条件会阻止它执行任何操作)
}
// 实际上,当i=n-2时,内层循环不会执行任何操作,
// 因为j从n-1开始,而内层循环的条件是j < n-1,这是不成立的。
// 但这并不影响算法的正确性,因为当只剩下一个元素时,它自然是有序的。
}
}
标签:arr,int,元素,交换,冒泡排序,算法,循环,排序
From: https://blog.csdn.net/m0_74051652/article/details/141650070