• 排序算法 之 冒泡排序


    之前看到一个题目,大概是:有一个长度为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;
                }
            }
        }
    }

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

  • 相关阅读:
    efwplus框架
    注册区域
    社招面试记录与总结
    验证码 Captcha 之大插件
    发生内存泄漏?
    Flume+LOG4J+Kafka
    协议如何保证可靠传输
    oracle之spool详细使用总结(转)
    SSH协议详解(转)
    oracle nologging用法(转)
  • 原文地址:https://www.cnblogs.com/liukemng/p/3715925.html
Copyright © 2020-2023  润新知