[R] Variation of bubble sort (based on divisors)

Boris Steipe boris.steipe at utoronto.ca
Sat Apr 1 02:15:21 CEST 2017


This looks opaque and hard to maintain.
It seems to me that a better strategy is to subset your vector with modulo expressions, use a normal sort on each of the subsets, and add the result to each other. 0 and 1 need to be special-cased.


myPrimes <- c(2, 3, 5)
mySource <- sample(0:10)

# special case 0,1
sel <- mySource < 2  
myTarget <- sort(mySource[sel])
mySource <- mySource[!sel]

# Iterate over requested primes
for (num in myPrimes) {
    sel <- !as.logical(mySource %% num)
    myTarget <- c(myTarget, sort(mySource[sel]))
    mySource <- mySource[!sel]
}

# Add remaining elements
myTarget <- c(myTarget, sort(mySource))  


B.






> On Mar 31, 2017, at 2:16 PM, Piotr Koller <pittbox33 at gmail.com> wrote:
> 
> Hi, I'd like to create a function that will sort values of a vector on a
> given basis:
> 
> -zeros
> 
> -ones
> 
> -numbers divisible by 2
> 
> -numbers divisible by 3 (but not by 2)
> 
> -numbers divisible by 5 (but not by 2 and 3)
> 
> etc.
> 
> I also want to omit zeros in those turns. So when I have a given vector of
> c(0:10), I want to receive 0 1 2 4 6 8 10 3 9 5 7 I think it'd be the best
> to use some variation of bubble sort, so it'd look like that
> 
> sort <- function(x) {
> for (j in (length(x)-1):1) {
>   for (i in j:(length(x)-1)) {
>     if (x[i+1]%%divisor==0 && x[i]%%divisor!=0) {
>      temp <- x[i]
>      x[i] <- x[i+1]
>      x[i+1] <- temp
>      }
>    }
>  }
> return(x)}
> 
> This function works out well on a given divisor and incresing sequences.
> 
> sort <- function(x) {
>  for (j in (length(x)-1):1) {
>     for (i in j:(length(x)-1)) {
>       if (x[i+1]%%5==0 && x[i]%%5!=0) {
>        temp <- x[i]
>        x[i] <- x[i+1]
>        x[i+1] <- temp
>       }
>      }
>     }
>  return(x)
> }
> 
> x <- c(1:10)
> print(x)
> print(bubblesort(x))
> 
> This function does its job. It moves values divisible by 5 on the
> beginning. The question is how to increase divisor every "round" ?
> 
> Thanks for any kind of help
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list