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

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

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

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

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

假设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

 

posted @ 2014-04-23 20:58  AndyZeng  阅读(418)  评论(0编辑  收藏  举报