在 Mac 上用 C++ 编写一个演示不同排序算法的程序。我找到了两个快速排序实现,qsort 和 qsort_b。
第一个当然是老式的、随处可见的 qsort。但是有 qsort_b,它接受一个块而不是一个函数。这是我的代码:
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <cstdio>
#include <ctime>
#define DATA 1000000
using namespace std;
int compare(const void* a, const void* b)
{
return *(int*)a - *(int*)b;
}
int main(int argc, char *argv[])
{
int* array = new int[DATA];
srand(time(0));
for ( int i = 0 ; i < DATA ; ++ i )
{
array[i] = rand() % 2147483647;
}
clock_t begin = clock();
qsort(array, DATA, sizeof(array[0]), compare);
//qsort_b(array, DATA, sizeof(array[0]), ^(const void* a, const void* b) { return *(int*)a - *(int*)b; });
clock_t end = clock();
cout << "Time it takes to sort " << DATA << " integers with quicksort: " << end - begin;
}
在这里,我看到了很大的速度差异,是什么导致了所有这些差异。据我了解,块用于并行处理,在这种情况下不会比函数快。没有什么可以并行处理的,是吗?
编辑:heapsort_b()、mergesort_b() 和 qsort_b() 例程就像没有 _b 后缀的相应例程一样,期望比较回调是块指针而不是函数指针。(来自 BSD 手册页)
编辑:速度差异。DATA 为 1000000,qsort 在 146832 ns 内完成,qsort_b 在 127391 ns 内完成。考虑到它快 10% 左右,这是一个相对较大的差异。
编辑:我已经编辑了代码,使其可以拥有更大的整数数组。我个人最大的测试结果是 100000000 个整数,28136278 (28s) vs. 23870078 (24s)。这对我来说是一个相当大的不同。