冒泡排序
冒泡排序(Bubble Sorting)的基本思想
通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒。
图解:
小结:
(1) 一共进行(数组的大小-1)次大的循环
(2)每一趟排序的次数在逐渐的减少
(3) 如果我们发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。这个就是优化 优化:
因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在 排序过程中设置一个标志 flag 判断元素是否进行过交换。从而减少不必要的比较。
代码实现
//将五个无序的数:3,9,-1,10,-2使用冒泡排序法将其排成一个从小到大的有序数列。 1. public class bubblesort { 2. public static void main(String[] args) { 3. int[] arr = {3, 9, -1, 10, -2}; 4. System.out.println("原数组为:" + Arrays.toString(arr)); 5. bubbleSort(arr); 6. System.out.println("排序后数组为:" + Arrays.toString(arr)); 7. } 8. 9. // 冒泡排序 的时间复杂度 O(n^2) 10. private static void bubbleSort(int[] arr) { 11. int temp = 0;// 临时变量 12. for (int i = 0; i < arr.length - 1; i++) { //第一层for表示几趟 13. boolean flag = false;// 标识变量,表示是否进行过交换(优化) 14. for (int j = 0; j < arr.length - 1 - i; j++) { //第二层for表示每一趟如何做 15. if (arr[j] > arr[j + 1]) {// 如果前面的数比后面的数大,则交换 16. flag = true; 17. temp = arr[j]; 18. arr[j] = arr[j + 1]; 19. arr[j + 1] = temp; 20. } 21. } 22. if (!flag) { //在一趟排序中,一次交换都没有发生过 23. break; 24. } 25. } 26. } 27. }