【发布时间】:2010-09-20 17:13:26
【问题描述】:
在 C# 中排序数据的最佳算法是什么?
是否有一种排序算法可以很好地处理 80% 的排序?
如果适用,请给出代码示例。
【问题讨论】:
在 C# 中排序数据的最佳算法是什么?
是否有一种排序算法可以很好地处理 80% 的排序?
如果适用,请给出代码示例。
【问题讨论】:
看看这个网站:
Sorting Comparisons with Animations
简答:快速排序
更长的答案: 上面的网站将通过一些漂亮的动画向您展示每种算法的优缺点。
简短的回答是排序没有最好的(但你知道,因为你说 80% 的时间 :))但快速排序(或 3 路快速排序)可能是你可以使用的最佳通用算法.
这是 .Net 中列表默认使用的算法,因此如果您的列表已经在列表中,您只需调用 .Sort。
如果你想看看如何实现,我在上面指出你的网站上有伪代码。
【讨论】:
List<T>.Sort` 实现非常聪明。这是一个快速排序检测退化的情况,如果事情失控,就会退回到堆排序。这样,它减轻了快速排序的最大缺点之一。我假设只要分区低于一定大小(一种非常常见的优化),它也会切断插入排序,尽管我不记得了。但是,它不稳定。
你想排序什么?有什么理由不使用:
List<T>.Sort() ?
我确信这使用了 QuickSort,您不必担心会出现任何编码错误。您可以实现 IComparable 来更改要排序的内容。
如果您的所有数据都无法存储在内存中......那么您将参加合并排序或类似的比赛。
【讨论】:
冒泡排序和插入排序是 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;
}
【讨论】: