使用预定义的排序值列表对对象排序

时间:2009-03-16 22:12:21

标签: algorithm sorting

我想知道以与不同数组相同的顺序对对象数组进行排序的最快方法是什么。

这是C#中的一个例子:

class MyClass
{
    public MyClass(int value)
    {
        this.value = value;
    }
    int value;
    public int Value
    {
        get { return value; }
        set { this.value = value; }
    }
}


    static List<int> sortedValuesList;
    static List<MyClass> objectList;

以与sortedValuesList相同的顺序排序objectList的最快方法是什么? 可能有多个具有相同值的对象。

我已经有了可以做到的简单算法,但它是O(n ^ 2)并且需要额外的内存。

修改: 我想还不清楚我在做什么。 假设用户在屏幕上看到销售人员的数据网格。他可以按照他想要的任何列对它们进行排序。现在,用户点击了一个按钮,正在显示一个客户表。每个客户都会引用一位销售人员。我想根据以前数据网格中销售人员的顺序对客户列表进行排序。

这只是一个理论问题,因为我不需要更多的表现。当你需要使用查找表来比较对象时,我只是想知道是否有一些很好的排序算法。

4 个答案:

答案 0 :(得分:2)

将其分解为步骤:

  1. 浏览您的sortedValuesList并根据值构建地图 - &gt;指数仓位;这是O(n log n)
  2. 浏览对象并在临时字段中添加索引(同样,O(n log n))
  3. 按临时字段(也是O(n log n))
  4. 对列表进行排序

    总算法,O(n log n)。

    或者,如果您不想拥有临时字段,则可以每次通过地图查找排序键,以获得整体O(n(log n)^ 2)

答案 1 :(得分:0)

这是我非常简单的解决方案:

class Program
{
    static List<int> sortedValuesList;
    static List<MyClass> objectList;

    static void Main(string[] args)
    {
        //Generate some test data;
        Random random = new Random();
        objectList = new List<MyClass>();
        sortedValuesList = new List<int>();
        for (int i = 0; i < 10; i++) {
            MyClass a = new MyClass(random.Next() % 20);
            objectList.Add(a);
            if (!sortedValuesList.Contains(a.Value))
                sortedValuesList.Add(a.Value);
        }

        //Shuffle id's
        for (int i = sortedValuesList.Count - 1; i > 0; i--) {
            int n = random.Next(i + 1);
            int tempId = sortedValuesList[n];
            sortedValuesList[n] = sortedValuesList[i];
            sortedValuesList[i] = tempId;
        }

        Console.WriteLine("Reference list:");
        for (int i = 0; i < sortedValuesList.Count; i++) {
            Console.WriteLine(string.Format("{0,2} {1,5}", i, sortedValuesList[i]));
        }

        Console.WriteLine("unsorted list:");
        for (int i = 0; i < objectList.Count; i++) {
            Console.WriteLine(string.Format("{0,2} {1,5}", i, objectList[i].Value));
        }

        //Sort
        List<MyClass> sortedList = new List<MyClass>();
        foreach (int id in sortedValuesList) {
            sortedList.AddRange(
                objectList.FindAll(delegate(MyClass a) { return a.Value == id; })
            );
        }

        Console.WriteLine("After sorting:");
        for (int i = 0; i < sortedList.Count; i++) {
            Console.WriteLine(string.Format("{0,2} {1,5}", i,  sortedList[i].Value));
        }
        Console.ReadKey();

    }
}

class Program { static List<int> sortedValuesList; static List<MyClass> objectList; static void Main(string[] args) { //Generate some test data; Random random = new Random(); objectList = new List<MyClass>(); sortedValuesList = new List<int>(); for (int i = 0; i < 10; i++) { MyClass a = new MyClass(random.Next() % 20); objectList.Add(a); if (!sortedValuesList.Contains(a.Value)) sortedValuesList.Add(a.Value); } //Shuffle id's for (int i = sortedValuesList.Count - 1; i > 0; i--) { int n = random.Next(i + 1); int tempId = sortedValuesList[n]; sortedValuesList[n] = sortedValuesList[i]; sortedValuesList[i] = tempId; } Console.WriteLine("Reference list:"); for (int i = 0; i < sortedValuesList.Count; i++) { Console.WriteLine(string.Format("{0,2} {1,5}", i, sortedValuesList[i])); } Console.WriteLine("unsorted list:"); for (int i = 0; i < objectList.Count; i++) { Console.WriteLine(string.Format("{0,2} {1,5}", i, objectList[i].Value)); } //Sort List<MyClass> sortedList = new List<MyClass>(); foreach (int id in sortedValuesList) { sortedList.AddRange( objectList.FindAll(delegate(MyClass a) { return a.Value == id; }) ); } Console.WriteLine("After sorting:"); for (int i = 0; i < sortedList.Count; i++) { Console.WriteLine(string.Format("{0,2} {1,5}", i, sortedList[i].Value)); } Console.ReadKey(); } }

答案 2 :(得分:0)

首先,帮自己一个忙,并使用List的通用版本,所以将objectList定义为

static List<MyClass> objectList;

但是,在任何一种情况下,由于List是对实际对象的引用的集合,并且因为您似乎希望以相同的顺序使两个列表,为什么不只是将一个列表分配给另一个?我错过了什么?

答案 3 :(得分:0)

听起来你想要一张地图:

static Dictionary<int, MyClass> sortedObjectList