我花了一些时间在C#中实现快速排序算法。完成后,我比较了实现速度和C#的Array.Sort-Method的速度。
我只是比较在随机整数数组上工作的速度。
这是我的实现:
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 .Sort:14.84秒
有谁知道如何更快地实现我的算法? 还是有人可以提供运行得更快的实施(不需要快速排序!)?
注意: -请不要使用使用多个内核/处理器来提高性能的算法 -仅有效的C#源代码
如果在线,我将在几分钟内测试所提供算法的性能。
编辑: 您认为对包含少于8个值的零件使用理想的分拣网络会提高性能吗?
有谁知道如何更快地实现我的算法?
通过将代码转换为使用指针,我能够节省10%的执行时间。
public unsafe static void UnsafeQuickSort(int[] data) { fixed (int* pdata = data) { UnsafeQuickSortRecursive(pdata, 0, data.Length - 1); } } private unsafe static void UnsafeQuickSortRecursive(int* data, int left, int right) { int i = left - 1; int 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) UnsafeQuickSortRecursive(data, left, j); if (++j < right) UnsafeQuickSortRecursive(data, j, right); return; } } }