【问题标题】:Best sorting algorithms for C# / .NET in different scenarios不同场景下 C#/.NET 的最佳排序算法
【发布时间】:2010-09-20 17:13:26
【问题描述】:

在 C# 中排序数据的最佳算法是什么?

是否有一种排序算法可以很好地处理 80% 的排序?

如果适用,请给出代码示例。

【问题讨论】:

标签: c# .net algorithm sorting


【解决方案1】:

【讨论】:

    【解决方案2】:

    看看这个网站: Sorting Comparisons with Animations

    简答:快速排序

    更长的答案: 上面的网站将通过一些漂亮的动画向您展示每种算法的优缺点。

    简短的回答是排序没有最好的(但你知道,因为你说 80% 的时间 :))但快速排序(或 3 路快速排序)可能是你可以使用的最佳通用算法.

    这是 .Net 中列表默认使用的算法,因此如果您的列表已经在列表中,您只需调用 .Sort

    如果你想看看如何实现,我在上面指出你的网站上有伪代码。

    【讨论】:

    • 请注意,C# 的 List<T>.Sort` 实现非常聪明。这是一个快速排序检测退化的情况,如果事情失控,就会退回到堆排序。这样,它减轻了快速排序的最大缺点之一。我假设只要分区低于一定大小(一种非常常见的优化),它也会切断插入排序,尽管我不记得了。但是,它不稳定。
    【解决方案3】:

    你想排序什么?有什么理由不使用:

    List<T>.Sort() ? 
    

    我确信这使用了 QuickSort,您不必担心会出现任何编码错误。您可以实现 IComparable 来更改要排序的内容。

    如果您的所有数据都无法存储在内存中......那么您将参加合并排序或类似的比赛。

    【讨论】:

      【解决方案4】:

      冒泡排序和插入排序是 O(n^2),合并排序和快速排序是 O(nlogn)。您可以使用 List 中的 Sort() 方法,该方法实现了 Quicksort,或者您也可以尝试实现它并使其适应您的需求。这是一个基本的实现: 快速排序

      //O(nlogn) 
      public static void QuickSort(int[] array, int init, int end)
      {
         if (init < end)
         {
             int pivot = Partition(array, init, end);
             QuickSort(array, init, pivot-1);
             QuickSort(array, pivot + 1, end);
         }   
      }
      
      //O(n)
      private static int Partition(int[] array, int init, int end)
      {
         int last = array[end];
         int i = init - 1;
         for (int j = init; j < end; j++)
         {
              if (array[j] <= last)
              {
                  i++;
                  Exchange(array, i, j);     
               }
          }
          Exchange(array, i + 1, end);
          return i + 1;
      }
      
      private static void Exchange(int[] array, int i, int j)
      {
          int temp = array[i];
          array[i] = array[j];
          array[j] = temp;
      }
      

      来自http://yadiragarnicabonome.com/sorting-arrays/

      【讨论】:

      • 快速排序是大 O(n²),因为大 O 是最坏的情况,您给出的平均情况是大 Theta aka Θ(n log(n))。快速排序是大 O 时间复杂度最差的一种。 Mergesort、Heapsort 或 Cubesort(或变体)是具有大 O(n log(n)) 时间复杂度的常见排序算法。你通常必须进入更专业或更复杂的东西才能在 Big O 中做得更好。如果你可以使用它,Heapsort 是我认为时间(Big Omega、Theta 和 O)和空间(大 O)。
      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2010-10-10
      • 2018-10-23
      • 1970-01-01
      • 2011-05-09
      • 2017-05-11
      • 1970-01-01
      相关资源
      最近更新 更多