冒泡排序(Bubble Sorting)的基本思想:通过对待排序序列从前向后(从下标较小的元素开始,依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒.
因为排序过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行交换,说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换,从而减少不必要的比较,(这里说的是优化,之后在基本的学完之后再说)
冒泡排序算法的一个过程.(对数组进行排序,原始数组:3,9,-1,10,20)
第一趟排序:
package sort;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {3, 9, -1, 10, -2};
//为了容易理解我们把冒泡排序的演变过程进行展示
/**
* 第一趟排序就是将最大的那个数,排到最后.
*/
int temp = 0;//临时变量
for (int j = 0; j < arr.length - 1; j++) {
//如果前面的数比后面的数大则交换
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第一趟排序后的数组:" + Arrays.toString(arr));
/**
* 第二趟排序就是将最大的那个数,排到最后.
*/
for (int j = 0; j < arr.length - 2; j++) {
//如果前面的数比后面的数大则交换
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第二趟排序后的数组:" + Arrays.toString(arr));
/**
* 第三趟排序就是将最大的那个数,排到最后.
*/
for (int j = 0; j < arr.length - 3; j++) {
//如果前面的数比后面的数大则交换
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第四趟排序后的数组:" + Arrays.toString(arr));
/**
* 第三趟排序就是将最大的那个数,排到最后.
*/
for (int j = 0; j < arr.length - 3; j++) {
//如果前面的数比后面的数大则交换
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第四趟排序后的数组:" + Arrays.toString(arr));
}
}
package sort;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {3, 9, -1, 10, -2};
//这里两个循环,可以看出冒泡排序的时间复杂度.O(n^2)
int temp = 0;//临时变量
for(int i=0;i<arr.length-1;i++){
for (int j = 0; j < arr.length - i; j++) {
//如果前面的数比后面的数大则交换
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第("+(i+1)+")趟排序:"+ Arrays.toString(arr));
}
System.out.println("最后得到的结果:"+ Arrays.toString(arr));
}}
package sort;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {-1,3, 9, 10, 20};
int temp = 0;//临时变量
boolean flag=false;//标识变量(表示是否进行过交换)
for(int i=0;i<arr.length-1;i++){
for (int j = 0; j < arr.length - i; j++) {
//如果前面的数比后面的数大则交换
if (arr[j] > arr[j + 1]) {
flag=true;//如果flag进来过这个循环,那么就一定进行过交换
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第("+(i+1)+")趟排序:"+ Arrays.toString(arr));
if(!flag){//在这一趟排序中,一次交换都没有发生过
break;
}else {
flag=false;//将flag重置,不重置的话会没有用的flag
}
}
System.out.println("最后得到的结果:"+ Arrays.toString(arr));
}}
package sort;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {-1, 3, 9, 10, -2};
int[] arr1={-1, 3, 9, 10, 20};
BubbleSorts(arr);
BubbleSorts(arr1);
}
//将前面的冒泡排序封装成一个方法
public static void BubbleSorts ( int[] arr){
int temp = 0;//临时变量
boolean flag = false;//标识变量(表示是否进行过交换)
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i; j++) {
//如果前面的数比后面的数大则交换
if (arr[j] > arr[j + 1]) {
flag = true;//如果flag进来过这个循环,那么就一定进行过交换
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第(" + (i + 1) + ")趟排序:" + Arrays.toString(arr));
if (!flag) {//在这一趟排序中,一次交换都没有发生过
break;
} else {
flag = false;//将flag重置,不重置的话会没有用的flag
}
}
System.out.println("最后得到的结果:"+ Arrays.toString(arr));
}}