• 基于比较的算法之一:冒泡排序


    冒泡排序是基于比较的排序中比较基本的算法。

    以升序排序目的为例,算法的中心思想是从头至尾的比较两两相邻的元素,如果发现有反序(决定了稳定性)的则交换两个相邻元素。完成第一趟比较后最大的元素放到了最末端。

    第二趟从头至尾的比较不用比较最后一个元素(最大元素已经在最末端正确位置),所以比第一次少比较了一个元素,这趟比较完成后,第二个元素到达正确位置。

    持续进行这样的操作,直到只剩下最后一个最小元素被放到了第一个位置,排序完成。

    假设n个元素排序:

    1.最好时间复杂度 O(n),比较次数C=n,即所有数据都已经按照小-〉大的顺序排好,只需要做n次比较,M=0次移动

    但是此种情况需要有一个记录数据是否移动的变量

    2.最差的时间复杂度为O(n2),即所有数据是原始反序的,则第i次扫描数据时的比较次数是Ci=n-i,i=0,1,2...(n-1),数据移动次数是Mi=3Ci

    所以比较次数总数Cmax=n(n-1)/2

    移动次数总数Mmax=3Cmax=3n(n-1)/2

    总次数为Cmax+Mmax=2n(n-1)

     所以冒泡排序最坏的时间复杂度是O(n2

    综上,因此冒泡排序总的平均时间复杂度为O(n2)。

    下面给出C#的通用冒泡排序算法:

    startIndex为排序区间的数组元素下标,通常为0,
    endIndex为排序区间的数组元素下标,通常为array.Length-1
        public class BubbleSort<T> where T : IComparable<T>
        {
            public void Sort(T[] array, int startIndex, int endIndex)
            {
                bool isMoved = false;
                for (int i = endIndex; i >= startIndex; i--)
                {
                    for (int j = startIndex; j < i; j++)
                    {
                        if (array[j].CompareTo(array[j + 1]) > 0)
                        {
                            T v = array[j + 1];
                            array[j + 1] = array[j];
                            array[j] = v;
                            isMoved = true;
                        }
                    }
                    if (isMoved == false) break;
                }
            }
        }

    作者:Andy Zeng

    欢迎任何形式的转载,但请务必注明出处。

    http://www.cnblogs.com/andyzeng/p/3683899.html

  • 相关阅读:
    开源 IM 工具编译与环境搭建攻略
    spark研究之install4j打包spark
    OPENFIRE+SPARK语音视频出错连不上的解决办法,倾心吐露:
    Openfire更服务器名称的方法
    install4j打包Spark详解
    关于install4j打包spark的一些方法
    ASP连接LOTUS数据库
    Enabling Large File Uploads On Your Domino Server for XPages
    phpcms v9 数据库操作函数
    phpcms前台的控制器
  • 原文地址:https://www.cnblogs.com/andyzeng/p/3683899.html
Copyright © 2020-2023  润新知