1、为什么叫冒泡排序:
现在回过头来学算法,总会问自己一些奇怪的问题。
比如为什么叫冒泡呢?为什么不叫冒烟呢? 哈哈,有时自己想想都搞笑。
上网查了查,这么起名是有道理的,就像水里的气泡一样,大的气泡会最先出来。
越大的元素会经常交换慢慢的“浮”到数列的顶端,当然这是从大到小排序,还有从小到大呢。
2、 冒泡排序的原理描述(从大到小):
1、重复遍历无序的数列。
2、依次比较相邻的两个元素,将关键字大的元素移到前面,小的移到后面,也就是大小互换位置。
3、这样每经过一趟过排序后,关键字最大的元素就会移到最前面,此时绩效该元素的位置。
4、下一趟只需要比较到此位置为止。直到整个序列有序为止。
3、下面结合代码分析一下:
网上有好多不是严格意义上的冒泡排序算法,也不知道是否拿来测试没有。
比如看看下面所谓冒泡排序,功能确实能实现,但我们分析分析看哪里有瑕疵。
package BubbleSort;
/*
* 冒泡排序 从大到小排序
* 2016年7月22日15:00:46
* 唐凌峰
*/
public class BubbleSort1 {
/* 从大到小排序
* 这样的排序是: 在内循环从j=2开始 ,比较的不是相邻的元素了,比较的间隔元素。
* 虽然能实现从大到小的排序,但个人认为没有严格 按照冒泡排序 原理来实现,你可以说是改良版或不是标准版的吧
*/
public void bubbleSortTest(){
int bubble[] ={8,18,4,78,11,56,88,99};
for(int i=0;i<bubble.length;i++){
for(int j=i+1;j<bubble.length;j++){
//比较相邻两个元素的大小,其实这么比较的不是相邻的两个元素,
if (bubble[i] < bubble[j]){
int temp =bubble[i];
bubble[i]=bubble[j];
bubble[j]=temp;
};
}
};
//打印出排序好的数组
for(int i=0;i<bubble.length;i++){
System.out.println("Index: "+i+" value: "+bubble[i]);
}
}
public static void main(String[] args){
BubbleSort1 bubbleSort= new BubbleSort1();
bubbleSort.bubbleSortTest();
}
}
就像注释里写的,当外循环 i=0 的时候,内循环得循环j=i+1从1循环到7吧!
这就意味着:当外循环是i=0时,内循环j=2时 ,比较的数是bubble[0]<bubble[2],比的是18<4 这两个元素。
同理 :当 外循环是i=0时,内循环j=3时,比较的数是bubble[0]<bubble[3],比较的是18<78这两个元素
虽然每经过依次比较,较大的元素慢慢移动到了前面去了,但是没有遵守冒泡排序原理来。
比较的元素:必须是相邻元素。 上面的demo 比较的元素显然不是相邻的元素。
下面再看看比较的是相邻的元素的demo吧(从大到小排序)
package BubbleSort;
/*
* 冒泡排序 从小到大排序
* 2016年7月22日15:00:46
* 唐凌峰
*/
public class BubbleSort2 {
/*
* 从小到大排序 如何让这个算法实现转换成 从大到小呢? 其实很简单
*/
public void bubbleSortTest(){
int bubble[] ={8,18,4,78,11,96,88,99};
for(int i=0;i<bubble.length;i++){
for(int j=0;j<bubble.length-i-1;j++){
//比较相邻两个元素的大小,一定要相邻元素比较,为什么原理就只这样的。
if (bubble[j+1]>bubble[j]){
int temp =bubble[j];
bubble[j]=bubble[j+1];
bubble[j+1]=temp;
};
}
};
//打印出排序好的数组
for(int i=0;i<bubble.length;i++){
System.out.println("Index: "+i+" value: "+bubble[i]);
}
}
public static void main(String[] args){
BubbleSort2 bubbleSort= new BubbleSort2();
bubbleSort.bubbleSortTest();
}
}
这个demo 为什么能做到 比较的一定是相邻的元素,妙就妙在 内循环的循环控制表达式:j<bubble.length-i-1。
如果我想从让排序从小到大这么办呢? 很简单 把内循环的if语句里的大于号改成小于号就行了。可以试试。