关于冒泡排序
冒泡排序是一种交换排序,通过遍历将两两数进行比较。如果是正序排序(从小到大排序)则会把大的数放到后面,同理如果是倒序排列(从大到小排序)会把大的数放在前面。
小例子1
如:49和38进行正序排列。
如果49大于38,则49与38交换位置。
小例子2
如:49、38和28进行正序排列。
先是他们两个进行对比,发现49大于38,将49放到38的后面。
于是变成了这样
然后再将49和28进行对比即
发现还是49大,于是将49与28交换位置。
于是就变成了这样
到此所有的数都与49进行了比较,算是完成了第一步。
我们可以发现在对比第一次的时候,即第一次遍历的时候,我们将最大的数放到了后面。
即如果我们将每一个数都进行这样的对比加遍历。对于一组包含n个数据的一组记录,最坏的情况是要进行n-1个排序(最后一个不用遍历因为所有比他大数都排在了后面,他是最小的)。
假定存在一个数组为a;
• 第一趟:依次比较a[0]和a[1]、a[1]和a[2]、a[2]和a[3]…==a[n-2]和a[n-1]==的元素。如果发现第一个数据大于后一个数据,交换它们,经过第一趟,最大的元素被排到了最后。
• 第二趟:依次比较 a[0]和a[1]、a[1]和a[2]、a[2]和a[3]… ==a[n-2]和a[n-1]==的元素。如果发现第一个数据大于后一个数据,交换它们,经过第二趟,倒数第二大的被排到了倒数第二位。
• 第n-1趟:依次比较0和1元素,如果发现第一个数据大于后一个数据,交换它们,经过第n-1趟,第2小(第n-1大)的元素排到了第2位。
小例子3
假定存在数组 98 45 87 23 15 88六个数进行冒泡排序
第一趟循环后 :45->87->23->15->88->98
第二趟循环后: 45->23->15->87->88->98
第三趟循环后: 23->15->45->87->88->98
第四趟循环后: 15->23->45->87->88->98
代码实现
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int []a=new int [6];//数组长度n为六
for (int i=0;i<a.length;i++){
a[i]=in.nextInt();
}
for (int i=0;i<a.length-1;i++){//循环n-1次,最后一次不用循环
for (int j=0;j<a.length-1-i;j++){//已经比对过的不用比对所以
//有个-i,同时要跟j+1进行比对,所以有个-1
//-i可以省略,但是-1不行
if (a[j]>a[j+1]){//如过a[j]大于a[j+1]
int tmp=a[j];//进行交换
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
for (int i=0;i<a.length;i++){//输出
System.out.print(a[i]+" ");
}
}