冒泡排序

什么是冒泡排序?

冒泡排序的英文是 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;
                }
        }
}

你可能感兴趣的:(冒泡排序)