Rcpp中的非递归快速排序

时间:2016-02-15 02:07:24

标签: c++ r recursion quicksort rcpp

我在recursive quick

中使用Rcpp排序算法和此代码
void Quick(NumericVector arr,int left,int right) { 
  int i=left;int j=right;
  double tmp;
  double pivot=arr[(left+right)/2];
  while(i<=j){
    while(arr[i]<pivot)
      i++;
    while(arr[j]>pivot)
      j--;
      if(i<=j){
        tmp=arr[i];
        arr[i]=arr[j];
        arr[j]=tmp;
        i++;
        j--;

      }
    }
  if(left<j)
    Quick(arr,left,j);
  if(i<right)
    Quick(arr,i,right);
}


    // [[Rcpp::export]]
    NumericVector sort_quick(NumericVector A) {
      NumericVector tmp=clone(A);
       Quick(tmp,0,tmp.size()-1); 
      return tmp;
    }

如何获得iterative进程来加速代码?

1 个答案:

答案 0 :(得分:0)

在快速排序的常见迭代实现中,您使用本地数组模拟调用堆栈。完成对子阵列的分区后,检查分区索引左侧是否有元素。如果是这样,你将一对索引推到代表该子阵列的“堆栈”上。然后,对分区索引右侧的子数组执行相同的操作。在循环的下一次迭代中,您从堆栈中弹出一对子数组索引,在该子数组上执行分区,然后执行上面描述的操作。

http://www.geeksforgeeks.org/iterative-quick-sort/

我不确定性能提升是否非常重要,但可能是一些。

对于非常大的输入大小,您可能会考虑做的另一件事是从向量中提取元素并将它们放入缓冲区,然后对缓冲区进行排序。访问开销,至少对于std :: vector来说,似乎是直接进入内存的两倍,所以一旦你通过一定的输入大小阈值,这就变得值得了。这是我在实现并行mergesort算法时偶然发现的。