用于检查列表是否按降序排序的除法和征服算法

时间:2015-02-15 20:20:42

标签: r algorithm recursion divide-and-conquer

我需要编写一个函数来检查数组/列表/向量(在R中)/ 按降序排序。必须使用Divide& Conquer实现答案。

这是我尝试过的(实施在R中):

is.sort<-function(x){    
  n<-length(x)
  if (n==1)
    return(T)

  mid<-floor(n/2)   
  x1<-is.sort(x[1:mid])
  x2<-is.sort(x[(mid+1):n])
  return(ifelse(x1>=x2,T,F))
}

但那总是返回T:/ 感谢您的帮助

1 个答案:

答案 0 :(得分:1)

使用D&amp; C实现这一点非常尴尬。但是,试试吧。

  1. 长度为1的序列始终排序。
  2. 如果x长度> = 2,则将其划分为2个非空子序列x1x2。如果x已排序,x1已排序,且x2中的最后一个元素大于或等于(假设非增加排序),则对x1进行排序x2中的第一个元素。
  3. 这可以实现为:

    is.sort<-function(x){
       n<-length(x)
       if (n==1)
          return(TRUE)
       mid<-floor(n/2)
       return(x[mid] >= x[mid+1] && is.sort(x[1:mid]) && is.sort(x[(mid+1):n]))
    }
    

    BTW,R具有is.unsorted函数,但它仅确定序列是否按w.r.t排序。 <<=。对于那些错过>=等效的人来说,这是一个简单的Rcpp实现:

    Rcpp::cppFunction('
    bool is_sort(NumericVector x) {
       int n=x.size();
       for (int i=0; i<n-1; ++i)
          if (x[i] < x[i+1]) return false;
       return true;
    }
    ')