详解七大排序算法(二)冒泡排序详解

冒泡排序

冒泡排序的英文Bubble Sort,是一种最基础的交换排序。之所以叫做冒泡排序,因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动。

从序列的一端开始往另一端冒泡,依次比较相邻的两个数的大小。

设数组长度为N。

1.每轮比较相邻的前后两个数据,如果前面数据大于或者小于后面的数据,就将二个数据交换。

2.这样每轮对数组的第0个数据到N-1个数据进行一次遍历后,最大或者最小的一个数据就到数组第N-1个位置。

3.   第一轮比较到下标为N-1的数据(最后一个),以后每次比较都-1。

时间复杂度

若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均为最小值。所以,冒泡排序最好的时间复杂度为O(n)

C(min) = n -1 ,M(min) = 0

若初始文件是反序的,需要进行n-1 趟排序。每趟排序要进行n-1 次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值,最坏的时间复杂度为O(n^{2})。

因此冒泡排序总的平均时间复杂度为O(n^{2})

  /**
     * 冒泡排序
     * @param arr
     */
    private void sort(int [] arr){

        for(int i = 0 ; i < arr.length - 1 ; i++){
            boolean change = false;
            for(int j = 0 ; j < arr.length - 1 - i ; j++){
                if(arr[j] > arr [ j + 1]){
                    int temp = arr[j+1];
                    arr[j+1] = arr[j];
                    arr[j]=temp;
                    change = true;
                }
            }
            if(!change)
                return;
        }
    }
 /**
     * 双冒泡排序
     * @param arr
     */
    private void sortT(int[] arr){

        int left = 0;
        int right = arr.length  - 1;

        while (left < right){

            for(int i = 0 ;i < right ;i++){
                if(arr[i] > arr [ i + 1]){
                    int temp = arr[i+1];
                    arr[i+1] = arr[i];
                    arr[i]=temp;
                }
            }
            left ++;

            for(int j = right - left ; j > 0  ; j--){
                if(arr[j-1] > arr [ j]){
                    int temp = arr[j-1];
                    arr[j-1] = arr[j];
                    arr[j]=temp;
                }
            }
            right --;

        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值