zoukankan      html  css  js  c++  java
  • Array.Sort方法

    该方法采取的排序算法是快速排序算法。有关该算法的一些理论知识,如下

    快速排序对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    有关该方法的介绍如下

    image

    该方法已经足够快,特别在元素数据量比较大的时候比较明显。

    image

    image

    我们知道其实Array是一个非常重要的数据结构,类似ArrayList或者List这种更高级的类型其实都是基于Array来做的。所以,在Array这个基础类型(它是一个抽象类)定义一个好的Sort方法是很重要的。

    我们来看一下List的Sort方法,你会发现它调用的就是Array.Sort方法,只不过是一个带泛型的方法而已

    image

    同样的代码也可以在ArrayList.Sort中找到

    下面来看一个实例

    static void Main(string[] args)
    {

        int[] numbers = new int[10];
        Random rnd = new Random();
        for (int i = 0; i < 10; i++)
        {
            numbers[i] = rnd.Next(100);//我们用随机数来增加练习的有趣性
        }

        Console.WriteLine("初始化:");
        Display(numbers);
        Console.WriteLine("排序后:");
        Array.Sort(numbers);
        Display(numbers);

        Console.Read();

    }

    static void Display(int[] numbers)
    {
        foreach (var item in numbers)
        {
            Console.Write(item + ",");
        }
        Console.WriteLine();

    }

    排序的结果如下

    image

    你看到,它很方便地进行了排序。默认情况下是升序的。那么如何让他按照降序排列呢?

    我们通常添加一个自定义的比较类型,让这个类型去告诉Array.Sort方法,我们要怎么比较元素

    class IntComparer : IComparer<int>
    {

        #region IComparer<int> 成员

        public int Compare(int x, int y)
        {
            if (_type == "DESC")
                return y.CompareTo(x);//我们这里正好让它反过来,就实现了降序了
            else
                return x.CompareTo(y);
        }

        #endregion

        private string _type = "ASC";
        public IntComparer(string type)
        {
            _type = type;
        }
    }

    然后,在调用代码中

    Console.WriteLine("初始化:");
    Display(numbers);
    Console.WriteLine("排序后:");
    Array.Sort(numbers, new IntComparer("DESC"));

    最后看到的结果就是

    image

    这样的设计很棒,对于我们的自定义类型也是一样的做法。

  • 相关阅读:
    BZOJ2219数论之神——BSGS+中国剩余定理+原根与指标+欧拉定理+exgcd
    Luogu 3690 Link Cut Tree
    CF1009F Dominant Indices
    CF600E Lomsat gelral
    bzoj 4303 数列
    CF1114F Please, another Queries on Array?
    CF1114B Yet Another Array Partitioning Task
    bzoj 1858 序列操作
    bzoj 4852 炸弹攻击
    bzoj 3564 信号增幅仪
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1441209.html
Copyright © 2011-2022 走看看