什么是冒泡排序?
冒泡排序的英文是 Bubble Sort ,是一种最基础的交换排序。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
那具体如何交换呢?
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
看代码
private void BobbleSort(int array[]){
int temp = 0 ;
for( int i = 0 ; i < array.length ; i++ ){
for( int j = 0 ; j < array.length-i-1 ; j++){ // j开始等于0
if(array[j] > array[j+1]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}
代码非常简单,外部循环控制所有的回合,内部循环进行每一轮的大小比较,交换位置;
其实以上冒泡排序还有可以再优化的地方
假如 排序的数组为 1,3,2,4,5,6;那么我们可以想象一下,第一次遍外部循环和内部循环就可以把数据排好,这时已经是有序数组了,后面的就无需再遍历对比了,对此第二版
private void BobbleSort(int array[]){
int temp = 0 ;
for( int i = 0 ; i < array.length ; i++ ){
boolean isSorted=true;
for( int j = 0 ; j < array.length-i-1 ; j++){ // j开始等于0
if(array[j] > array[j+1]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
isSorted=false;//由元素交换,所以不是有序
}
}
if(isSorted){
break;
}
}
}
这里给它设置了一个boolean值判断它是否由元素交换,如果没有就提前退出!
我们优化了外部循环,其实里面循环也可以再优化
private void BobbleSort(int array[]){
int temp = 0 ;
int lastChangeIndex=0;
int sortBorder = array.length - 1;
for( int i = 0 ; i < array.length ; i++ ){
boolean isSorted=true;
for( int j = 0 ; j < sortBorder ; j++){ // j开始等于0
if(array[j] > array[j+1]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
isSorted = false;//由元素交换,所以不是有序
lastChangeIndex = j;
}
}
sortBorder=lastChangeIndex;
if(isSorted){
break;
}
}
}
网友评论