基本排序之冒泡排序

原理

  重复地走访过要排序的元素列,依次比较两个相邻元素的大小,如果他们的顺序错误就把他们交换过来,重复地进行交换直到没有相邻元素需要交换,也就是说该元素已经排序完成。这个就好比水中的气泡一样,也来越大,所以人们把这种算法称之为“冒泡排序”。

简而言之,相邻两个数字进行比较大小,将值大的放在右边

     第一躺排序之后,最后一个元素一定为该数组中最大的数字

   第二趟排序之后,倒数第二个元素一定为该数组中的第二大数字

   ……

   最后,数组第一个元素为最小的元素,排序结束

实现方式

 用两个循环进行实现,比较大小主要在内层循环进行,外层循环在内层循环结束后才++减少排序趟数,两个循环就相当于c语言中的两个指针一样,讲了这么多,估计也看烦了,直接上代码吧!

 代码段

public class BubbblingSort {

    public static void solution(int[]a,int length){
        for(int i=0;i<length-1;i++){    //外层循环,控制排序趟数
            for(int j=0;j<length-1-i;j++){  //内层循环,依次比较两个元素,较大的则往后移
                if(a[j]>a[j+1]){
                    int temp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=temp;
                }
            }
        }
    }
    public static void main(String[] args) {
        int[]a={6,5,9,4,3,2,7};
        int len=a.length;
        solution(a,len);
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]);
        }
    }
}

冒泡排序的时间复杂度

复杂度是根据for循环来进行计算的,

由上图代码可以看出,外层循环会执行N次,内层循环执行N-1次,所以复杂度为:O(n^2)

冒泡排序的优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值,思路简单,很容易理解,

  1.如果数据为正序,只需要走一趟即可完成排序,此时的比较次数N-1和记录移动次数0均达到最小值,所以,冒泡排序最好的时间复杂度为O(n)

    2.如果数据为反序,则需要进行n-1趟排序,每趟排序要进行n-i次比较(1≤i≤n-1),在这种情况下,冒泡排序最坏的时间复杂度为O(n^2)

 

posted @ 2019-03-26 12:59  QAQqiulin  阅读(227)  评论(0编辑  收藏  举报