List.Sort和冒泡排序,哪个更快? (关闭)

时间:2011-09-04 14:54:24

标签: c# sorting

例如,我有一个List

 List<int> list = new List<int>();

 list.Add(1);
 list.Add(5);
 list.Add(7);
 list.Add(3);
 list.Add(17);
 list.Add(10);
 list.Add(13);
 list.Add(9);
  1. 我使用像这样的List.Sort方法

    private static int Compare(int x, int y)
    {
            if (x == y)
                return 0;
            else if (x > y)
                return -1;
            else
                return 1;
    }
    List.Sort(Compare);
    
  2. 我使用像这样的冒泡排序

     private static void Sort(List<int> list)
     {
        int size = list.Capacity;
        for (int i = 1; i < size; i++)
        {
             for (int j = 0; j < (size - i); j++)
             {
               if (list[j] > list[j+1])
               {
                  int temp = list[j];
                  list[j] = list[j+1];
                  list[j+1] = temp;
                }
             }
        }
    }
    
  3. 我的问题就像标题,我想知道哪个更快?

    谢谢

3 个答案:

答案 0 :(得分:6)

总的来说,冒泡排序比其他任何东西都要慢,包括用快速排序算法实现的List.Sort

答案 1 :(得分:4)

冒泡排序很容易实现,但效率不高。 List.Sort方法使用QuickSort,这是一种更复杂,也更有效的算法。

但是,当您的列表中的项目非常少时(如您的示例中),算法的效率并不重要。重要的是它是如何实现的以及有多少开销,所以你只需要使用Stopwatch类来计算你的例子。这当然只会告诉您哪个更快,因为您正在测试的确切列表更快,因此选择要在应用程序中使用的算法并不是非常有用。

此外,当列表中的项目非常少时,哪种算法更快,并不重要,因为它总是花费很少的时间。您应该考虑实际实施中将有多少项目,以及项目数量是否会随着时间的推移而增长。

答案 2 :(得分:3)

查看the documentation of List<T>.Sort()

  

平均而言,此方法是O(n log n)运算,其中n是Count;在最坏的情况下,它是一个O(n ^ 2)操作。

由于冒泡排序为O(n ^ 2)(平均而且在最坏的情况下),您可以期望List<T>.Sort()在大型数据集上更快(更快)。排序8个元素(如你所有)的速度通常非常小(甚至使用冒泡排序),这与你使用的内容无关。

在这种情况下,可能影响速度的是您使用List<T>.Sort()的委托,而不是使用冒泡排序。调用委托是相对较慢的,所以当你进行微优化时(如果你不应该在大多数情况下都这样做),你应尽量避免使用它们。