【算法修炼之道】——冒泡排序

版权声明:希望各位能遵守各自内心的原则 https://blog.csdn.net/weixin_40918067/article/details/82115126

冒泡排序

冒泡排序(又被称为气泡排序或泡沫排序)的基本思路???——》用两个循环条件语句嵌套;外循环是从大局来看???——》也就是遍历整个数组;那内循环呢???——》其实也就是从”外循环遍历到的地址“开始比较之后的元素,而且也是遍历的比较相邻的元素;

【例子】以数列{20,40,30,10,60,50}为例,演示它的冒泡排序过程(如下图)

该题代码实现:

/**
 * 冒泡排序:Java
 *
 * @author skywang
 * @date 2014/03/11
 */

public class BubbleSort {

    /*
     * 冒泡排序
     *
     * 参数说明:
     *     a -- 待排序的数组
     *     n -- 数组的长度
     */
    public static void bubbleSort1(int[] a, int n) {
        int i,j;

        for (i=n-1; i>0; i--) {
            // 将a[0...i]中最大的数据放在末尾
            for (j=0; j<i; j++) {

                if (a[j] > a[j+1]) {
                    // 交换a[j]和a[j+1]
                    int tmp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = tmp;
                }
            }
        }
    }

    /*
     * 冒泡排序(改进版)
     *
     * 参数说明:
     *     a -- 待排序的数组
     *     n -- 数组的长度
     */
    public static void bubbleSort2(int[] a, int n) {
        int i,j;
        int flag;                 // 标记

        for (i=n-1; i>0; i--) {

            flag = 0;            // 初始化标记为0
            // 将a[0...i]中最大的数据放在末尾
            for (j=0; j<i; j++) {
                if (a[j] > a[j+1]) {
                    // 交换a[j]和a[j+1]
                    int tmp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = tmp;

                    flag = 1;    // 若发生交换,则设标记为1
                }
            }

            if (flag==0)
                break;            // 若没发生交换,则说明数列已有序。
        }
    }

    public static void main(String[] args) {
        int i;
        int[] a = {20,40,30,10,60,50};

        System.out.printf("before sort:");
        for (i=0; i<a.length; i++)
            System.out.printf("%d ", a[i]);
        System.out.printf("\n");

        bubbleSort1(a, a.length);
        //bubbleSort2(a, a.length);

        System.out.printf("after  sort:");
        for (i=0; i<a.length; i++)
            System.out.printf("%d ", a[i]);
        System.out.printf("\n");
    }
}

我们了解了该算法的思路,那么接下来就来该分析冒泡排序的时间和空间的复杂性!!!——》

冒泡排序时间复杂度

冒泡排序的时间复杂度是O(N^2)???——》假设被排序的数列中有N个数;遍历一趟的时间复杂度是O(N),需要遍历多少次呢?N-1次!;

冒泡排序稳定性

冒泡排序是稳定的算法???——》 假设在数列中存在a[ i ] = a[ j ],若在排序之前,a[ i ]在a[ j ]前面;并且排序之后,a[ i ]仍然在a[ j ]前面。则这个排序算法是稳定的;

但是这种排序不提倡,这是因为其简单性和复杂度;但是它有唯一显著优势是:它可以检测输入序列是否已经是排序的;

猜你喜欢

转载自blog.csdn.net/weixin_40918067/article/details/82115126