[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