zoukankan      html  css  js  c++  java
  • 排序算法 之 冒泡排序

    之前看到一个题目,大概是:有一个长度为n的数组,数组内的元素取值范围为0到m,且不相等,要求元素经过n次移动后使数组有序(即算法的复杂度为O(n))。看到题目后想了快速排序和归并排序发现并不能满足题目要求,直到有次看书又看到了桶排序然后豁然开朗,所以决定把这些排序算法再写一遍,加深记忆。

    约定:之后的文章默认待排序的数组大小都为n,排序结果为由小到大,采用c#作为代码实现。

    1.基本的冒泡排序算法:

    基本思想:

    冒泡排序外层共需要对序列进行n-1次遍历,内层从e[0]到e[n-i](i为外层遍历的次数)两两进行比较,如果e[j-1]>e[j]则进行交换,直到比较e[0]和e[1]后为止,冒泡排序算法的时间复杂度为O(n²);;

    代码实现:

    /// <summary>
    /// 基本的冒泡排序算法
    /// </summary>
    /// <param name="intArray"></param>
    /// <param name="length"></param>
    public static void BubbleSort(int[] intArray, int length)
    {
        int i, j, temp;
        for (i = 0; i < length; i++)
        {
            for (j = 1; j < length - i; j++)
            {
                if (intArray[j - 1] > intArray[j])
                {
                    temp = intArray[j - 1];
                    intArray[j - 1] = intArray[j];
                    intArray[j] = temp;
                }
            }
        }
    }
    2.改进的冒泡排序算法一:
    上面的排序算法不管某次循环后数组是否已经有序,依然继续遍历,这样的话在对基本有序的数组进行排序是效率显然是很低的,我们可以设置一个标志位,判断某次遍历后元素是否发生了交换,如果没有发生交换则证明排序完成,结束遍历从而提高效率 ;
    代码实现:
    /// <summary>
    /// 改进后的冒泡排序算法1
    /// 设立标志判断某次循环是否发生了交换,如果没有发生交换则证明排序完成
    /// </summary>
    /// <param name="intArray"></param>
    /// <param name="length"></param>
    public static void BubbleSort1(int[] intArray, int length)
    {
        int i, temp, k = length;
        bool flag = true;
        while (flag)
        {
            flag = false;
            for (i = 1; i < k; i++)
            {
                if (intArray[i - 1] > intArray[i])
                {
                    flag = true;
                    temp = intArray[i - 1];
                    intArray[i - 1] = intArray[i];
                    intArray[i] = temp;
                }
            }
            k--;
        }
    }

    3.改进的冒泡排序算法二:

    上面改进后的冒泡排序算法还可以继续改进,比如在进行第一次遍历前序列元素排列是这样的,我们发现当把元素5,4进行交换后,后面的元素已经有序,则我们可以设置一个标志,记录最后一次交换元素的位置,在以后的遍历中可以根据设置的标志来缩短要比较元素的下界;

    3 2 1 5 4 6 7 8 9

    代码实现:

    /// <summary>
    /// 改进后的冒泡排序算法2
    /// 记录最后一次交换的位置作为排序交换的结束位置
    /// </summary>
    /// <param name="intArray"></param>
    /// <param name="length"></param>
    public static void BubbleSort2(int[] intArray, int length)
    {
        int i, temp, index, k = length;
        while (k > 0)
        {
            index = k;
            k = 0;
            for (i = 1; i < index; i++)
            {
                if (intArray[i - 1] > intArray[i])
                {
                    k = i;
                    temp = intArray[i - 1];
                    intArray[i - 1] = intArray[i];
                    intArray[i] = temp;
                }
            }
        }
    }

    以上就是冒泡排序算法的内容。

  • 相关阅读:
    sfs2x 连接 mongodb
    java websocket
    webstorm 4.0 注册码
    解决 sfs2 admin tool 找不到扩展
    window 注册表五大类
    opengl 学习第二日
    java google Protobuf
    扩展 java sencha touch PhonegapPlugin
    sencha touch2 kryonet socket phonegap 通信 作者:围城
    sencha touch2 layout 笔记
  • 原文地址:https://www.cnblogs.com/liukemng/p/3715925.html
Copyright © 2011-2022 走看看