鉴于自己每次明白了算法下次又忘记,可能就是没有完全明白,所以才会忘记。
一、基本思路
冒泡排序法的基本思想就是:数组内容从前往后相邻的两个数依次进行比较,把较大的数往后移动,从而一轮最终把最大的数放最后面。
int a[]={7,5,8,3};
//1轮1次比较:7和5交换,结果为{5,7,8,3}
//1轮2次比较:7和8不变,结果为{5,7,8,3}
//1轮3次比较:8和3交换,结果为{5,7,3,8}
//1轮结果为{5,7,3,8}
第一轮结束,最大的只已经放到最后面,所以下次排序只需要对前面的三个数进行比较。
//2轮1次比较:5和7不变,结果为{5,7,3,8}
//2轮2次结果:7和3交换,结果为{5,3,7,8}
//2轮结果:{5,3,7,8}
第二轮结束,又把第二大的数放到了最大数的前面,所以下次比较直比较前面两个数即可。
//3轮1次交换:5和3交换,结果为{3,5,7,8}
第三轮结束,完成从小到大的排序。
总结:所以外循环是从小到大1,2,3轮,而内循环是比较的次数从大到小3,2,1次。意思就是第一轮内循环3次,第二轮内循环2次,第三轮内循环1次。
二、算法实现
1.基础实现和优化实现
public class Test{
public static void main(String asgr[]){
int a[]={8,6,9,4,7,3,5,2,1};
BubbleSort bsort=new BubbleSort();
//bsort.bubble_sort(a);
bsort.bubble_sort_better(a);
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
}
}
public class BubbleSort{
//基本实现
public void bubble_sort(int a[]){
for(int i=0;i<a.length;i++){
for(int j=0;j<a.length-1-i;j++){
if(a[j]>a[j+1]){
int t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
}
//优化实现
public void bubble_sort_better(int a[]){
for(int i=0;i<a.length;i++){
Boolean boo=true;
for(int j=0;j<a.length-1-i;j++){
if(a[j]>a[j+1]){
boo=flase;//发生交换
int t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
if(boo) break;
/*
这里的意思是如果内循环比较一圈并没有发生交换,说明该数组已经是有序的了,可以不用在排序,所以
break跳出当前最近的整个循环。
比如:数组是{5,1,2,3,4},这里只在i=0是时候,j循环了一圈,结果就为{1,2,3,4,5}。而正常的基本实
现,还会循环i=1,2,3,4,所以被必要,即可停止。
*/
}
}
}