【发布时间】:2020-02-09 06:31:09
【问题描述】:
我已经在 Rcpp 中实现了快速排序算法,但对于大型数组,它的运行速度明显慢于 sort(array, method="quick")。为什么?
这是我的 Rcpp 代码
// partition using hoare's scheme
#include <Rcpp.h>
using namespace Rcpp;
int partition(NumericVector a,int start,int end)
{
double pivot = a[end];
int i = start - 1;
int j = end + 1;
//Rcout << a <<"\n";
while(1)
{
do {
i++;
} while (a[i] < pivot);
do {
j--;
} while (pivot < a[j]);
if(i > j)
return j;
//special.Swap(a, i, j);
std::swap(a[i], a[j]);
}
}
void qsort(NumericVector a,int start,int end)
{
//Rcout << start <<"," << end <<"\n";
if(start < end)
{
int P_index = partition(a, start, end);
//Rcout << P_index << "\n";
qsort(a, start, P_index);
qsort(a, P_index + 1, end);
}
}
// [[Rcpp::export]]
NumericVector QuickSortH_WC(NumericVector arr)
{
int len = arr.size();
qsort(arr, 0, len-1);
//Rcout << arr <<"\n";
return 1;
}
同样对于具有浮点值的数组,算法更差。我想和 hoare's 和 lomuto 分区方案做个比较,但我不知道这个实现是否有任何缺陷,因为哪个算法工作得更慢。
【问题讨论】:
-
这是否依赖于使用 Rcpp?你能展示你所做的明确比较吗?你看过
std::sort的实现吗? -
@RalfStubner,除了
std::sort,看看qsort,它是由R实现的。 -
@RalfStubner 我已经使用 microbenchmark 包进行了明确的比较。感觉代码太大,这里就不给了。