冒泡排序(Bubble Sort)
2018-09-15 16:49 简简单单1111 阅读(442) 评论(0) 编辑 收藏 举报冒泡排序算法通过多次比较交换来实现排序,其排序流程如下:
1、对数组中的数据,从前往后依次比较相邻的两个数的大小,小数放前,大数放后。
2、即首先比较第1个数和第2个数比较,小数放前,大数房后。然后比较第2个数和第3个数,将小数放前,大数放后,直至比较到最后两个数,重复此步骤,直至所有数据比较完成。
3、第一趟比较完成后,最后一个数一定是数组中最大的一个,所以第二趟排序比较的时候最后一个数不参与比较。
4、第二趟比较完成后,倒数第二个数也一定是数组中的第二大的数,所以第三趟排序的时候最后两个数不参与比较。
5、依次类推,每一趟比较次数-1 。
6、冒泡排序可以从前往后比较,也可以从后往前比较。
7、对于n个数据的数组排序,需要进行n-1次排序。
举例1:要排序的数组 int arr={118 ,101 ,105 ,127, 112};
第一趟排序:
第一次比较 :118>101,交换位置:101,118,105,127,112;
第二次比较 :118>105,交换位置:101,105,118,127,112;
第三次比较 :118<127,不交换位置:101,105,118,127,112;
第四次比较 :127>112,交换位置:101,105,118,112,127。(127一定是数组中最大的数,下次排序不需要比较)
第二趟排序 :
第一次比较 :101<105,不交换位置:101,105,118,112,127;
第二次比较 :105<118,不交换位置:101,105,118,112,127;
第三次比较 :118>112,交换位置:101,105,112,118,127;(118是数组的第二大的数,下次排序不需要比较)
第三趟排序:
第一次比较:101<105,不交换位置:101,105,112,118,127;
第二次比较:105<112,不交换位置:101,105,112,118,127;(112是数组的第三大的数,下次排序不需要比较)
第四趟排序:
第一次比较:101<105,不交换位置:101,105,112,118,127;
前三趟排序已经排好前三大的数(127,118,112),第四次排序只需要比较一次,就可以确定最终的排序。
举例2: 要排序的数组 int arr1={9,7,3,1},即需要进行三次排序:
第一趟排序:
第一次比较:9>7,交换位置:7,9,3,1;
第二次比较:9>3,交换位置:7,3,9,1;
第三次比较:9>1,交换位置:7,3,1,9;(9是最大的数,下次排序不需要比较)
第二趟排序:
第一次比较:7>3,交换位置:3,7,1,9;
第二次比较:7>1,交换位置:3,1,7,9;(7是第2大的数,下次排序不需要比较)
第三趟排序:
第一次比较:3>1,交换位置:1,3,7,9;(最终的排序)
冒泡排序的过程可以形象的类似于水泡的浮起过程,故因此得名。冒泡排序在进行N个数据的进行排序时,无论原始的数据有无顺序,
都需要进行N-1步的中间排序,这种排序方法简单直观,但是缺点是执行的步骤有点长,效率不是很高。
N个数字进行排序的时候,需要进行N-1趟排序,每趟排序的次数为N-i次,所以外层控制循环多少趟,内层控制每一趟的循环次数。
代码示例为Eg03
public static void main(String[] args) {
int [] aaa={118,101,105,127,112};
System.out.println("冒泡排序之前的数组为:");
for (int a : aaa) {
System.out.print(a+" ");
}
//外层循环控制排序趟数
for (int i = 0; i < aaa.length-1; i++) {
for (int j = 0; j < aaa.length-i; j++) {
if(aaa[j]>aaa[j+1])
{
int temp=aaa[j+1];
aaa[j+1]=aaa[j];
aaa[j]=temp;
}
}
System.out.println();
System.out.println("第"+i+"次冒泡排序结果为:");
for (int b : aaa) {
System.out.print(b+" ");
}
}
}