# [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]
}

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