经典的冒泡排序
冒泡排序太经典了,就和打印"Hello World"一样经典。
但有的时候我还是会忘记冒泡排序怎么写,所以写下笔记和思路。
首先从名字入手,冒泡冒泡,算法的过程就很形象了。把要排序的数据当成一个个大小不一的泡泡,我们通过一次次的比较最终把最大的泡泡排在最后面。第一次找出最大的泡泡排在最后面,第二次找到第二大的泡泡排在倒数第二的位置,总共进行n-1次,我们就能把所有泡泡排正确。
先上图解:
图中红色竖线后面的就是已经排好的,下次再比较就不用和它们比较了,我们每次比较从第一个开始,我们想象成泡泡接力比赛,小泡泡把接力棒交给大泡泡,第一个和后面一个比较,谁大谁就拿着接力棒,如果后面的泡泡比前一个小,小泡泡就会被超位置,到最后一定是拿着接力棒的大泡泡到终点。一轮比赛完毕,到终点的大泡泡不用再参加比赛,所以比赛泡泡数减少。
然后我们再接着上代码:
public static void main(String[] args) {
int [] x ={7,3,2,4,5,6,8,9,10}; //泡泡集合
for(int i=0;i<x.length-1;i++){ //有n个泡泡,我们只需要进行n-1轮比赛,i代表第几轮比赛
for(int j=0;j<x.length-1-i;j++){ //i代表已经到过终点的泡泡,这时它们不需要再比赛了
if(x[j]>x[j+1]){ //j是每一轮比赛的泡泡数(i,j都是从0开始的哟)
int temp=0;
temp=x[j];
x[j]=x[j+1];
x[j+1]=temp;
}
}
}
for(int i=0;i<x.length;i++){ //遍历输出泡泡集合,此时是有序的泡泡
System.out.println(x[i]+" "); //2 3 4 5 6 7 8 9 10
}
}
冒泡排序算法用到了双层循环,它的时间复杂度为O(n^2),典型的入门算法,所以一定要理解透彻。
附:影响算法好坏的几个要素:
1)时间复杂度
算法运行的时候,执行的次数,执行的次数越多,计算机需要的时间越多
2)空间复杂度
内存方面的开销,太大的内存开销可能会导致堆、栈内存溢出
//下面的程序有可能让堆内存溢出
//OutOfMemoryError: Java heap space
byte [] x =new byte[1*1024*1024*200];
System.out.println("ok");
//下面的代码会导致栈内存溢出
//StackOverflowError
public static void main(String[] args) {
test();
}
static void test(){
test();
}
- 健壮性
健壮性是指算法对不合理数据输入的反应能力和处理能力
4)难易度