1.基本介绍
冒泡排序的基本思想:重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。即两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
2.数据演示
例如:
第0次排序:5 1 6 3 2 9
第1次排序:1 5 3 2 6 9
第2次排序:1 3 2 5 6 9
第3次排序:1 2 3 5 6 9
第4次排序:1 2 3 5 6 9
第5次排序:1 2 3 5 6 9
在第一次排序中:1小于5交换位置,然后5和6比较,位置不变,然后6和3比较,交换位置,然后6和2比较,交换位置,最后6与9比较,位置不变,最后第一次确定的最大值为9放在最后;
在第二次排序中:1和5位置不变,然后5与3比较,交换位置,接着5与6比较不变,确定第二大的数为6;
在第三次排序中:1和3比较位置不变,3和2比较,交换位置,最后3与5比较不变,确定5为第三大的数字;
在第四次比较中:1和2不变,之后2与3比较位置不变,最后确定3第四大的数;
在第五次比较中:1和2比较,位置不变,所以排序完毕;
即每次交换时,都要将最大的数放在队尾部分,且最后一次交换后,最小的数就不用比较了,所以循环次数为数组长度减去1;
3.算法思路
小编认为,在写代码时,要用两个循环嵌套,内循环进行数字的交换,外循环来确定内循环执行几次,且在内循环中要完成数组元素的交换。
4.代码如下
public class bubble {
public static void main(String[] args) {
int temp=0;
int index=0;
int arr[]={5,1,6,3,2,9};
for (int j = 0; j < arr.length-1 ; j++) {
for (int i = 0; i < arr.length-1 ; i++) {
if(arr[i]>arr[i+1]){
temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
index++;
System.out.println("第"+index+"次排序后"+ Arrays.toString(arr));
}
System.out.println("排序结束,最终排序为"+Arrays.toString(arr));
}
}
在算法中交换两个数值要先用一个变量存储其中一个值,然后在交换后,将变量赋值给另一个即可完成交换。
演示结果:
第1次排序后[1, 5, 3, 2, 6, 9]
第2次排序后[1, 3, 2, 5, 6, 9]
第3次排序后[1, 2, 3, 5, 6, 9]
第4次排序后[1, 2, 3, 5, 6, 9]
第5次排序后[1, 2, 3, 5, 6, 9]
排序结束,最终排序为[1, 2, 3, 5, 6, 9]
5.代码优化
如上图演示的过程,在排序中,数组已经有序,但是仍要按循环规定次数执行,所以小编认为在排序过程中,我们可以加条件实现循环的跳出。
代码如下:
public class bubble {
public static void main(String[] args) {
int temp=0;
int index=0;
boolean bool=false;
int arr[]={5,1,6,3,2,9};
for (int j = 0; j < arr.length-1 ; j++) {
for (int i = 0; i < arr.length-1 ; i++) {
if(arr[i]>arr[i+1]){
bool=true;
temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
index++;
if(bool==false){
break;
}else {
bool=false;
}
System.out.println("第"+index+"次排序后"+ Arrays.toString(arr));
}
System.out.println("排序结束,最终排序为"+Arrays.toString(arr));
}
}
小编这里加入了if语句,如果发没发生元素的位置交换就直接跳出循环。
演示结果:
第1次排序后[1, 5, 3, 2, 6, 9]
第2次排序后[1, 3, 2, 5, 6, 9]
第3次排序后[1, 2, 3, 5, 6, 9]
排序结束,最终排序为[1, 2, 3, 5, 6, 9]
6.时间演示
小编在循环前后加入了两端代码,当随机的数有100000个时,排序需要16秒,所以排序时间很长。(当然不能输出元素哈,太多了)
7.总结
冒泡排序的优点是简单易懂,容易实现。但缺点也很明显,就是效率较低,在数据量较大时不适合使用。其平均时间复杂度为 O(n²),空间复杂度为 O(1)。
限于小编能力有限,本篇难免会有一些瑕疵,希望各位uu提出宝贵意见。
觉得有用就点个赞吧。