冒泡排序是一种计算呼科学领域的较简单的排序算法,它重复的走访过要排序的数列,一次比较两个相邻的元素,如果他们排序错误,就把他们交换过来。
假设有一个一维数组{15,20,17,18,16,27,23}用冒泡排序的方式将他们从小到大排序。
第一次比较: 循环次数:1 比较次数: 6
15,17,18,16,20,23,27
此次比较出27是数组中最大元素,放在最后下一次比较27不再参加比较。
第二次比较: 循环次数:2 比较次数:5
15,17,16,18,20,23
此次比较出23是最大的元素,放在最后,23不再参与到下一次的比较中。
第三次比较: 循环次数:3 比较次数:4
15,16,17,18,20
此次比较出20是最大的元素,放在最后,23不再参与到下一次的比较中。
第四次比较: 循环次数:4 比较次数:3
15,16,17,18
此次比较出18是最大的元素,放在最后,18不再参与到下一次的比较中。
第五次比较 循环次数:5 比较次数:2
15,16,17
此次比较出17是最大的元素,放在最后,17不再参与到下一次的比较中。
第六次比较 循环次数:6 比较次数:1
15,16
此次比较出16是最大的元素,放在最后,16不再参与到下一次的比较中。此时还剩一个元素”15”是数组中的最小的元素
循环次数:数组长度-1
比较次数+循环次数 = 数组长度
冒泡排序算法如下:
public static void main(String[] main){
int []array = {15,20,17,18,16,27,23};
System.out.println("排序前的数组");
System.out.println(Arrays.toString(array));
//冒泡排序的算法
//控制数组的循环次数
for(int i=0;i<array.length-1;i++){
//控制比较次数
for(int j=0;j<array.length-1-i;j++){
//相邻两个数组进行比较
if(array[j]>array[j+1]){
//元素互换
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
System.out.println("数组冒泡排序后:");
System.out.println(Arrays.toString(array));
}
运行结果如下:
排序前的数组
[15, 20, 17, 18, 16, 27, 23]
数组冒泡排序后:
[15, 16, 17, 18, 20, 23, 27]
如果说数组本身就是有序的在用上面的算法会浪费很多的时间,可以采用如下的算法:
public static void main(String[] main){
int[] array = {1,2,3,4,5,6};
System.out.println("排序前的数组");
System.out.println(Arrays.toString(array));
//设置数组为有序的
boolean flag = false;
/**
* 如果数组排序一次为无序,继续排序
* 如果排序一次依然为有序,跳出循环,直接输出
*/
for(int i=0;i<array.length-1;i++){
for(int j=0;j<array.length-1-i;j++){
if(array[j]>array[j+1]){
//进入此方法说明数组时无序的
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
//设置数组是无序的
flag = true;
}
}
if(!flag){
//判断数组合是否有序,有序跳出循环
break;
}
}
System.out.println("冒泡排序后的数组为:");
System.out.println(Arrays.toString(array));
}
运行结果如下:
排序前的数组
[1, 2, 3, 4, 5, 6]
冒泡排序后的数组为:
[1, 2, 3, 4, 5, 6]
推荐使用第二种方法
以上是我对冒泡排序的理解,如有不对还请指正