美文网首页
冒泡排序

冒泡排序

作者: 奇梦人 | 来源:发表于2018-10-11 22:57 被阅读0次

    什么是冒泡排序?

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

    相关文章

      网友评论

          本文标题:冒泡排序

          本文链接:https://www.haomeiwen.com/subject/fphiaftx.html