Java排序算法之冒泡排序

本章介绍Java经典排序算法中的冒泡排序,欢迎各位同学转载,但转载务必注明出处:https://blog.csdn.net/qq_35101450/article/details/89072688,谢谢~

什么是冒泡排序

冒泡排序,算法如其名,我们可以把要排序的每一个元素想象成一个泡泡,数组或者集合相当于装这些泡泡的大水缸,那小的泡泡比较轻,会慢慢冒上来,大的泡泡比较重,就会沉下去(当然泡泡都是浮在水面上的 ,你就当是大的泡泡太胖了,水都浮不起它~)

冒泡排序原理

其实我们上体育课排成一列的时候,就采用的是冒泡排序的原理,相邻两个同学进行比较,高的往后站,矮的往前移,第一轮比较完之后,个子最高的就排在了最后面,我们在下一轮比较的时候就不考虑他了。然后继续下一轮的比较,以此类推,直到排好序为止。

原理图:

Java排序算法之冒泡排序_第1张图片

代码示例:

package String;

public class BubbleSortDemo {
	public static void main(String[] args) {
		// 原始数组
		int[] arr = { 24, 69, 80, 57, 13 };
		System.out.println("排序前:");
		printArray(arr);
		bubbleSort(arr);
		System.out.println("排序后:");
		printArray(arr);
	}

	// 冒泡排序
	private static void bubbleSort(int[] arr) {
		for (int x = 0; x < arr.length - 1; x++) {// 外层循环控制需要比较多少轮,总共需要比较数组长度-1次
			for (int y = 0; y < arr.length - 1 - x; y++) {// 内层循环控制每轮比较多少次
				if (arr[y] > arr[y + 1]) {
					int temp = arr[y];// 把较大的值先存起来
					arr[y] = arr[y + 1];// 把小的值“冒”上去
					arr[y + 1] = temp;// 把大的值往后移
				}
			}
		}
	}

	private static void printArray(int[] arr) {
		System.out.print("[");
		for (int i = 0; i < arr.length; i++) {
			if (i == arr.length - 1) {// 最后一个元素
				System.out.println(arr[i] + "]");
			} else {
				System.out.print(arr[i] + ",");
			}
		}
	}

}

运行结果:

排序前:
[24,69,80,57,13]
排序后:
[13,24,57,69,80]

冒泡排序优化

如果我们拿到的数据本来就是一个已经排好序的数组,或者说在某一次排序完成后,数组已经排好序,那我们就没有必要继续排序了。所以我们可以这样做,初始化一个标记位,在每一轮排序时把这个标记位赋值为0,在进入内循环排序过程中,如果元素没有进行了交换操作,说明数组已经排好序,这时跳出循环,完成排序。

代码示例:

package String;

public class BubbleSortDemo {
	public static void main(String[] args) {
		// 原始数组
		int[] arr = { 24, 69, 80, 57, 13, 15, 66, 88, 86 };
		System.out.println("排序前:");
		printArray(arr);
		bubbleSort(arr);
		System.out.println("排序后:");
		printArray(arr);
	}

	// 冒泡排序
	private static void bubbleSort(int[] arr) {
		int flag = 1;
		int count = 0;
		for (int x = 0; x < arr.length - 1; x++) {// 外层循环控制需要比较多少轮,总共需要比较数组长度-1次
			flag = 0;// 每次置为0
			count++;
			for (int y = 0; y < arr.length - 1 - x; y++) {// 内层循环控制每轮比较多少次
				if (arr[y] > arr[y + 1]) {
					flag = 1;
					int temp = arr[y];// 把较大的值先存起来
					arr[y] = arr[y + 1];// 把小的值“冒”上去
					arr[y + 1] = temp;// 把大的值往后移

				}
			}
			System.out.print("第" + (x+1) + "次排序后:");
			printArray(arr);
			if (0 == flag) {// 某一轮排序过程中,元素没有交换,则跳出
				break;
			}
		}
		System.out.println("第" + count + "次发现已经排好序,则停止排序");

	}

	private static void printArray(int[] arr) {
		System.out.print("[");
		for (int i = 0; i < arr.length; i++) {
			if (i == arr.length - 1) {// 最后一个元素
				System.out.println(arr[i] + "]");
			} else {
				System.out.print(arr[i] + ",");
			}
		}
	}

}

运行结果:

排序前:
[24,69,80,57,13,15,66,88,86]
第1次排序后:[24,69,57,13,15,66,80,86,88]
第2次排序后:[24,57,13,15,66,69,80,86,88]
第3次排序后:[24,13,15,57,66,69,80,86,88]
第4次排序后:[13,15,24,57,66,69,80,86,88]
第5次排序后:[13,15,24,57,66,69,80,86,88]
第5次发现已经排好序,则停止排序
排序后:
[13,15,24,57,66,69,80,86,88]

以上是对冒泡排序的讲解,面试经常会问到,大家有疑问欢迎评论,我看到会第一时间回复~

你可能感兴趣的:(Java排序算法之冒泡排序)