Java算法

冒泡排序

Posted by Chen Xingxu on April 26, 2020

Java 算法之冒泡排序

算法介绍

冒泡排序又称起泡排序。它是通过一系列的“交换”动作完成的。首先第一个关键字和第二个关键字比较,如果第一个大,则二者交换,否则不交换;然后第二个关键字和第三个关键字比较,如果第二个大,则二者交换,否则不交换······一直按这种方式进行下去,最终最大的那个关键字被交换到了最后,一趟冒泡排序完成。经过多趟这样的排序,最终使整个序列有序。这个过程中,大的关键字像石头一样“沉底”,小的关键字像气泡一样逐渐向上“浮动”,冒泡排序的名字由此而来。要注意的是,冒泡排序算法结束的条件是在一趟排序过程中没有发生关键字交换

冒泡排序算法常规代码:

public static void bubbleSort(int R[], int n){ //默认待排序关键字为整型
    int i, j, flag;
    int temp;
    for(i = n - 1; i >= 1; --i){
        flag = 0; //变量 flag 用来标记本趟排序是否发生了交换
        for(j = 1; j <= i; ++j){
            if(R[j-1] > R[j]){
                temp = R[j];
                R[j] = R[j-1];
                R[j-1] = temp;
                flag = 1; //如果没发生交换,则flag的值为0;                		  
            }			//如果发生了交换,则flag的值改为1
        }
        if(flag == 0) //一趟排序过程中没有发生关键字交换,则证明序列有序
            return;		//排序结束
    }
}

冒泡排序算法速记代码:

public static void bubbleSort(int[] arr){
    for(int x = 0; x < arr.length - 1; x++){
        for(int y = 0; y < arr.length - x - 1; y++){
            if(arr[y] > arr[y+1]){
                int temp = arr[y];
                arr[y] = arr[y+1];
                arr[y+1] = temp;
            }
        }
    }
}

冒泡排序算法常规代码性能分析:

  1. 时间复杂度分析

    由冒泡排序算法代码可知,可选取最内层循环中的关键字交换操作作为基本操作。

    1) 最坏情况,待排序列逆序,此时对于外层循环的每次执行,内层循环中 if 语句的条件 R[j] < R[j-1] 始终成立,即基本操作执行的次数为 n - i。i 的取值为 1 ~ n - 1。因此,基本操作总的执行次数为 (n - 1 + 1)(n - 1) / 2 = n(n - 1) / 2,由此可知时间复杂度为 O(n²)。

    2) 最好情况,待排序列有序,此时内层循环中 if 语句的条件始终不成立,交换不发生,且内层循环执行 n - 1 次后整个算法结束,可见时间复杂度为 O(n)。

    综合以上两种情况,平均情况下的时间复杂度为 O(n²)。

  2. 空间复杂度分析

    由算法代码可以看出,额外辅助空间只有一个 temp,因此空间复杂度为 O(1)。