排序算法

  排序就是将一组数据按照某种逻辑顺序重新排序的过程。排序算法的目的就是将所有元素的主键按照这种逻辑顺序排列。

  先编写一个排序算法的基类,后面其他算法可以直接继承:

    public class BaseSort
    {
        public BaseSort()
        {
        }

        public static void Sort(IComparable[] a)
        {

        }

        /// 
        /// 比较
        /// 
        /// 
        /// 
        /// 
        public static bool Less(IComparable v, IComparable w)
        {
            return v.CompareTo(w) < 0;
        }

        /// 
        /// 交换
        /// 
        /// 
        /// 
        /// 
        public static void Exch(IComparable[] a, int i, int j)
        {
            IComparable t = a[i];
            a[i] = a[j];
            a[j] = t;
        }

        public static void Show(IComparable[] a)
        {
            for (var i = 0; i < a.Length; i++)
                Console.WriteLine(a[i]);
        }
    }

  将数据操作限制在 Less 和  Exch 这两个方法中使得代码的可读性和可移植性更好,并且更容易验证代码的正确性,分析性能以及排序算法之间的比较。

  

  运行时间

  要评估算法的性能。首先要计算各个排序算法在不同的随机输入下的基本操作的次数(包括比较和交换,或者数组读写的次数),然后,用这些数据来估计算法的相对性能。

  排序成本模型:比较和交换的次数。对于不交换元素的算法,需要计算访问数组的次数。

  

  额外的内存使用

  排序算法的额外内存开销和运行时间一样重要。排序算法可以分为两类:一是除了函数调用所需的栈和固定数目的实例变量之外无需额外内存的原地排序算法,二是需要额外内存空间来存储另一份数组副本的其他排序算法。

 

  IComparable  

  由上面的基类可知,后面实现的算法适用于任何实现了 IComparable 接口的数据类型。

 

  各种算法

  1.冒泡排序(选择排序),插入排序

  2.希尔排序

  3.归并排序

       4.快速排序

  5.堆排序

 

  稳定性

  如果排序方法保留数组中相等键的相对顺序,则该方法是稳定的。例如,假设在我们的互联网商务应用程序中,我们在交易到达时将交易输入到数组中,因此它们按数组中时间字段的顺序排列。现在假设该应用程序要求按位置将事务分开以进行进一步处理。一种简单的方法是按位置对数组进行排序。如果排序不稳定,则每个城市的交易不一定会在排序后按时间顺序排列。我们在本章中考虑过的一些排序方法是稳定的(插入排序和归并排序),许多则不是(选择排序,希尔排序,快速排序和堆排序)。

  排序算法_第1张图片

 

  各种排序算法的特定

  排序算法_第2张图片

  Quicksort (快速排序)是最快的通用排序。如果稳定性很重要并且空间可用,则mergesor (归并排序)t可能是最好的。在某些对性能至关重要的应用程序中,重点可能只是对数字进行排序,因此避免使用引用和对原始类型进行排序。

  Java系统程使用 quicksort 来实现基本类型的排序,并使用 mergesort 来实现引用类型的排序。这些选择的主要实际含义是为了保持稳定性和保证性能(对于引用类型)而对速度和内存使用(对于原始类型)进行权衡。

 

你可能感兴趣的:(排序算法)