zoukankan      html  css  js  c++  java
  • 基于比较的算法之二:选择排序

    算法思想:

    排序数组内元素由小到大:

    1.每一趟从序列中选出最大的元素,然后与末尾的元素对调(决定了此排序是不稳定的,因为有可能把原位置元素调换到与和它等值的元素前面)。

    2.重复1的动作,把上一部调换到末尾的元素排除在外。

    3.当只剩下第一个元素时,排序完毕。

    时间复杂度:

    设共有n个元素

    最好情况,原来数组元素正好是排好序的,则第i次扫描的比较次数是Ci=n-i,i=0,1,2...(n-1),数据移动次数是Mi=0

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

    所以选择排序最好的时间复杂度是O(n2),比冒泡排序要坏(其实我有点怀疑冒泡排序用一个变量记录没有反序的情况是否也可以放到选择排序里面来)。

    最坏情况,原来数据正好是逆序的,则第i次扫描的比较次数是Ci=n-i,i=0,1,2...(n-1),数据移动次数是Mi=3

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

    数据移动次数是Mmax=3n

    总的次数为Cmax+Mmax=3n+n(n-1)/2,比冒泡排序要好,因为移动次数少了。

    所以选择排序最坏的时间复杂度也是O(n2

    下面给出C#的通用选择排序算法:

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

    作者:Andy Zeng

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

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

  • 相关阅读:
    java的语法基础(二)
    MyBatis 的好处是什么?
    python中字符串的编码和解码
    Spring的简介和优点?
    相对于Statement,PreparedStatement的优点是什么?
    MyBatis 的好处是什么?
    .final finally finalize区别
    final类有什么用
    web广泛用到的技术:
    JDK,JRE,JVM三者的关系
  • 原文地址:https://www.cnblogs.com/andyzeng/p/3683982.html
Copyright © 2011-2022 走看看