Here's one way. Make a vector where the numerals are padded with zeros, then sort by this vector.
v1.padded <- mapply(gsub, list('\\d+'), sprintf('%.4d', as.numeric(regmatches(v1, gregexpr('\\d+', v1)))), v1)
# "p 0001" "p 0002" "p 0010" "p 0011"
v1[order(v1.padded)]
# "p 1" "p 2" "p 10" "p 11"
Here's a second way to do it that would generalize to situations where the strings have more than one numeral.
v1<- c("p 1 1", "p 11 1", "p 1 2", "p 2 3", "p 10 4")
parallel.split <- lapply(data.frame(do.call(rbind, strsplit(v1, ' ')), stringsAsFactors=FALSE), type.convert, as.is=TRUE)
inter <- do.call(interaction, c(parallel.split, list(lex.order=TRUE)))
v1[order(inter)]
# [1] "p 1 1" "p 1 2" "p 2 3" "p 10 4" "p 11 1"