#include <Rcpp.h>
# include<algorithm>
using namespace Rcpp;
/*
* This file contains some algorithms of sorting written in C++ & implimented in RCPP .
* All these algorithms are not performed as well as sort inner algorithm
* used in R except of the sort_stl function .
*
* get pdf: source
* MACHERKI M.E
* 12/02/2016
*/
// [[Rcpp::export]]
NumericVector sort_insert(NumericVector A) {
int i,j;
double x;
for(i=1; i<A.size();i++){
x=A[i];j=i-1;
while((j>=0) & (A[j]>x)){ //without using swapping
A[j+1]=A[j];
j=j-1;
}
A[j+1]=x;
}
return A;
}
// [[Rcpp::export]]
NumericVector sort_bubble(NumericVector A) {
int n=A.size();
int swap=1;
double tmp;
for(;;){
if(swap==0)break;
swap=0;
for(int i=1;i<n;i++){
if(A[i-1]>A[i]){
tmp=A[i];A[i]=A[i-1];A[i-1]=tmp;
swap=1;
}
}
}
return A;}
// [[Rcpp::export]]
NumericVector sort_selection(NumericVector A) {
int i,j;
double tmp;
for(j=0;j<A.size();j++){
int imin=j;
for(i=j+1;i<A.size();i++){
if(A[i]<A[imin])imin=i;
}
if(imin!=j){
tmp=A[j];A[j]= A[imin];A[imin]=tmp;
}
}
return A;}
// [[Rcpp::export]]
NumericVector gaps( int sz ) {
NumericVector result;
result.push_back(701);
result.push_back(301);
result.push_back(132);
result.push_back(57);
result.push_back(23);
result.push_back(10);
result.push_back(4);
result.push_back(1);
return result;}
// [[Rcpp::export]]
NumericVector sort_shell(NumericVector A) {
double temp=0;
int N =A.size();
int i,j,gap;
NumericVector tacuda=gaps(0);
int n=tacuda.size();
for(int k=n-1;k>0;k--){
gap=tacuda[k];
for( i=gap;i<N;i++){
temp=A[i];
for( j=i;(j>=gap)&(A[j-gap]>temp);j-=gap){
A[j]=A[j-gap];
}
A[j]=temp;
}
}
return A;}
// This function is faster then R sort function !
// [[Rcpp::export]]
NumericVector sort_stl(NumericVector A) {
NumericVector tmp=clone(A);
std::sort(tmp.begin(),tmp.end());
return tmp;
}
// [[Rcpp::export]]
void Quick(NumericVector arr,int left,int right) {
int i=left;int j=right;
double tmp;
double pivot=arr[(left+right)/2];
/*partition*/
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--;
}
}
/*recursion*/
if(left<j)
Quick(arr,left,j);
if(i<right)
Quick(arr,i,right);
}
/*
* This function is really comparable with the inner sort used in R
* even the code is sample , the algorithm is good.
*/
// [[Rcpp::export]]
NumericVector sort_quick(NumericVector A) {
NumericVector tmp=clone(A);
Quick(tmp,0,tmp.size()-1); //just starting from the middle of the vector
return tmp;
}
// R call
/*** R
###not rapid methods, adapted to small sample size
x<-rnorm(100)
sort_insert(x)
sort (x)
sort_selection(x)
sort_bubble(x)
identical(sort_stl(x),sort (x))## the purpose of C++ integration
identical(sort_quick(x),sort (x))
identical(sort_insert(x),sort (x))
identical(sort_bubble(x),sort (x))
identical(sort_selection(x),sort (x))
identical(sort_shell(x),sort (x))
x<-rnorm(1000000) ##large numeric vector
system.time(sort(x))
system.time(sort_quick(x)) ## as R sort function
system.time(sort_stl(x)) ## two time faster the R sort!!!
*/
Saturday, February 13, 2016
Source file example for some sorting algorithms written in C++ via RCPP to R implimentation
Friday, February 12, 2016
Subscribe to:
Posts (Atom)