排序算法-冒泡排序
创始人
2024-02-21 03:20:14
0

基本思路

遍历给定的数组,从左往右,两两比较,小的放在左边,大的放在右边,遍历完成,数组有序。

先来看一个冒泡排序的过程:

给定数组:[5,3,2,1,4]

排序结果:[1,2,3,4,5]

拆解步骤

1.第一轮从左往右循环,遍历前5个数:

(1) 来到5和3,5大于3  ==>  5和3交换 

 

(2) 来到5和2,5大于2 ==> 5和2交换

 (3) 来到5和1,5大于1 ==> 5和1交换

 (4) 来到5和4,5大于4 ==> 5和4交换

 第一轮遍历结束,最右侧的5是数组中最大的,不用动了。

 

2.第二轮从左往右循环,遍历前4个数

 (1) 来到3和2,3大于2 ==> 3和2交换

(2) 来到3和1,3大于1 ==> 3和1做交换 

 

 (3) 来到3和4,3小于4 ==> 不用交换

第二轮遍历结束,最右侧的4已经是待排序数中最大的,不用动。

……略

得出规律

依次类推,得出规律:

1.每一次遍历的都是左侧待排序的数,遍历完成后会将最大的数放到最右边。

2.一共需要数组长度次数的遍历,比如数组长度是5,就需要5次遍历。

代码实现

public class BubbleSort {public static void main(String[] args) {int[] arr = {5, 3, 2, 1, 4};for (int i : arr) {System.out.print(i);System.out.print(" ");}System.out.println();bubbleSort(arr);System.out.println("冒泡排序后 ---->");for (int i : arr) {System.out.print(i);System.out.print(" ");}}/*** 冒泡排序** @param arr 待排序的数组*/public static void bubbleSort(int[] arr) {if (arr == null || arr.length < 2) {return;}for (int i = 0; i < arr.length; i++) {  // 数组长度是多少,就需要遍历多少次数组for (int j = 0; j < arr.length - i - 1; j++) { // 每次遍历的范围是 0 ~ len-i-1if (arr[j] > arr[j + 1]) {swap(arr, j, j + 1);}}}}/*** 数组交换** @param arr    数组* @param index1 下标1* @param index2 下标2*/public static void swap(int[] arr, int index1, int index2) {arr[index1] = arr[index1] + arr[index2];arr[index2] = arr[index1] - arr[index2];arr[index1] = arr[index1] - arr[index2];}
}

对数器验证

import cn.hutool.core.util.RandomUtil;
import java.util.Arrays;
public class BubbleSortTest {public static void main(String[] args) {int[] arr1 = new int[1000];for (int i = 0; i < arr1.length; i++) {arr1[i] = RandomUtil.randomInt(0, 10000);}final int[] arr2 = Arrays.copyOf(arr1, arr1.length);System.out.println("拷贝的数组arr2是否等于arr1:" + equals(arr1, arr2));print(arr1);Arrays.sort(arr1);System.out.println("使用系统的排序算法排序后的数组 ------->");print(arr1);BubbleSort.bubbleSort(arr2);System.out.println("使用冒泡排序算法排序后的数组 ------->");print(arr2);System.out.println("冒泡排序算法结果与系统内置排序算法结果是否一致:" + equals(arr1, arr2));}public static void print(int[] arr){for (int i : arr) {System.out.print(i);System.out.print(" ");}System.out.println();}public static boolean equals(int[] arr1, int[] arr2){if(arr1 == null && arr2 == null){return true;}if(arr1 == null || arr2 == null){return false;}if(arr1.length != arr2.length){return false;}for (int i = 0; i < arr1.length; i++) {if(arr1[i] != arr2[i]){return false;}}return true;}}

 优化

思路:如果在一次遍历中,发现所有的元素都不需要交换,那么说明这个数组已经是有序数组了。

比如一个数组:[1,2,3,4,5],其冒泡排序过程如下:

 

 对于这种有序数组,其实只需要遍历一次就可以了。我们可以在每次循环的时候记录当前循环是否发生了交换操作,如果没有发生,就提前结束排序操作,因为数组已经是有序了。

需要优化的核心代码:

/*** 冒泡排序** @param arr 待排序的数组*/
public static void bubbleSort(int[] arr) {if (arr == null || arr.length < 2) {return;}for (int i = 0; i < arr.length; i++) {  // 数组长度是多少,就需要遍历多少次数组boolean swaped = false; // 用来记录是否交换的变量for (int j = 0; j < arr.length - i - 1; j++) { // 每次遍历的范围是 0 ~ len-i-1if (arr[j] > arr[j + 1]) {swaped = true; // 如果发生了交换,就记为trueswap(arr, j, j + 1);}}if(!swaped){// 如果一次交换都没有发生,就是数组已经有序了return;}}
}

其他定论

1.冒泡排序在排序期间没有申请其他的内存空间,它的空间复杂度是O(1),所以是原地排序算法

2.冒泡排序对于相同数值的元素来说,每次排序后所在的位置不变,因此冒泡排序是稳定的排序算法

3.冒泡排序的时间复杂度是O(n^2)

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...