【发布时间】:2020-06-14 13:44:52
【问题描述】:
我花了一些时间在 C# 中实现快速排序算法。 完成后,我比较了我的实现速度和 C# 的 Array.Sort-Method。
我只是比较处理随机 int 数组的速度。
这是我的实现:
static void QuickSort(int[] data, int left, int right)
{
int i = left - 1,
j = right;
while (true)
{
int d = data[left];
do i++; while (data[i] < d);
do j--; while (data[j] > d);
if (i < j)
{
int tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}
else
{
if (left < j) QuickSort(data, left, j);
if (++j < right) QuickSort(data, j, right);
return;
}
}
}
性能(对长度为 100000000 的随机 int[] 进行排序时):
- 我的算法:14.21 秒
- .Net Array
有人知道如何更快地实现我的算法吗?
或者任何人都可以提供更快的实现(不必是快速排序!)我运行得更快?
注意:
- 请不要使用使用多个内核/处理器来提高性能的算法
- 只有有效的 C# 源代码
如果我在线,我会在几分钟内测试所提供算法的性能。
编辑:
您认为对小于 8 的零件使用理想的排序网络会提高性能吗?
【问题讨论】:
-
当一个数组已经排序时,尝试重复你的计时......然后使用一个只有两个项目顺序错误的数组......
-
性能提升 4.3% - 你这样做是出于学术原因吗?
-
Ian 关于已经排序的数组是正确的。您选择的枢轴元素将具有可怕的最坏情况性能。话虽如此,加速快速排序是相当简单的。使用 MedianOfThree 方法选择更好的枢轴,并为小分区使用更合适的排序算法。我假设您这样做是为了个人研究,因为使用系统库排序方法几乎总是正确的答案。
-
您可以展开其中一个递归分支。我不确定 C#/JIT 是否会这样做。
-
我刚刚完成:尝试对已排序的数组进行排序时,我的算法变得非常慢。