sort
位于 base
包(package)。 说明
将向量或因子(部分)排序(或排序)为升序或降序。要对多个变量进行排序,例如对数据帧进行排序,请参阅 order
。
用法
sort(x, decreasing = FALSE, ...)
## Default S3 method:
sort(x, decreasing = FALSE, na.last = NA, ...)
sort.int(x, partial = NULL, na.last = NA, decreasing = FALSE,
method = c("auto", "shell", "quick", "radix"), index.return = FALSE)
参数
x |
为了 |
decreasing |
合乎逻辑的。排序应该增加还是减少?不可用于部分排序。 |
... |
要传递给方法或从方法传递的参数,或者(对于没有类的默认方法和对象)传递给 |
na.last |
用于控制 |
partial |
|
method |
指定所使用算法的字符串。不可用于部分排序。可以缩写。 |
index.return |
逻辑指示是否也应返回排序索引向量。 |
细节
sort
是可以编写方法的泛型函数,sort.int
是内部方法,如果仅使用前三个参数,则与 S 兼容。
默认的 sort
方法将 order
用于分类对象,而分类对象又使用通用函数 xtfrm
(并且可能会很慢,除非已定义 xtfrm
方法或 is.numeric(x)
为 true)。
复数值首先按实部排序,然后按虚部排序。
"auto"
方法选择"radix"
简称(小于 元素)数值向量、整数向量、逻辑向量和因子;否则,"shell"
。
除了方法 "radix"
之外,字符向量的排序顺序将取决于所使用的语言环境的整理顺序:请参阅 Comparison
。因子的排序顺序是其级别的顺序(这特别适合有序因子)。
如果 partial
不是 NULL
,则它包含结果元素的索引,这些元素将通过部分排序放置在排序数组中的正确位置。对于指定位置的每个结果值,任何小于该值的值都保证在排序数组中具有较小的索引,而任何大于该值的值都保证在排序数组中具有较大的索引。 (这样做是为了提高效率,并且许多选项不可用于部分排序。只有当 partial
有少量元素时才会显著提高效率,并且如果有,则完成完整排序(如果可能,则进行快速排序)超过 10 个。)名称将被丢弃以进行部分排序。
方法 "shell"
使用 Shellsort(Sedgewick (1986) 的 变体)。如果 x
有名称,则使用稳定修改,因此关系不会重新排序。 (这仅在存在名称时才重要。)
方法 "quick"
使用 Singleton (1969) 的 Hoare 快速排序方法实现,并且仅当 x
为数字(双精度或整数)且 partial
为 NULL
时可用。 (对于其他类型的 x
,会默默地使用 Shellsort。)它通常比 Shellsort 快一些(在长度为 100 万的向量上可能快 50%,在长度为 10 亿时快两倍),但在罕见的最坏情况下性能较差。 (Peto 使用伪随机中点进行的修改是为了使最坏的情况更加罕见。)这不是稳定的排序,并且关系可能会重新排序。
方法"radix"
依靠简单的散列来随输入大小线性缩放时间,即其渐近时间复杂度为O(n)。该特定变体及其实现源自 data.table 包,由 Matt Dowle 和 Arun Srinivasan 贡献。对于小输入 (< 200),实现使用就地操作的插入排序 (O(n^2)),以避免基数排序的分配开销。对于范围小于 100,000 的整数向量,它会切换到更简单、更快的线性时间计数排序。在所有情况下,排序都是稳定的;关系的顺序被保留。它是整数向量和因子的默认方法。
"radix"
方法通常优于其他方法,特别是对于小整数。与快速排序相比,对于具有大整数或实数值的向量,它的速度稍快(但与快速排序不同,基数是稳定的并且支持所有na.last
选项)。该实现比字符向量的 shell 排序快几个数量级,但排序规则不考虑区域设置,因此即使在英语区域设置中也会给出错误的答案。
但是,基数排序有一些注意事项:
-
如果
x
是一个character
向量,所有元素必须共享相同的编码。仅支持 UTF-8(包括 ASCII)和 Latin-1 编码。整理如下LC_COLLATE=C,即使用字节的数字顺序按字典顺序逐字节排列。 -
不支持Long vectors(具有 或更多元素)和
complex
向量。
值
对于 sort
,结果取决于调度的 S3 方法。如果 x
没有类,则使用 sort.int
并应用其说明。对于没有特定方法的类对象,将使用默认方法,该方法相当于 x[order(x, ...)]
:这取决于具有适用于 [
的方法的类(并且 order
也可以工作,这需要xtfrm
方法)。
为了sort.int
该值是排序向量,除非index.return
当结果是一个包含名为的组件的列表时为 truex
和ix
包含排序后的数字和排序索引向量。在后一种情况下,如果method ==
"quick"
关系的顺序可能会颠倒(与sort.list
)因为快速排序不稳定。为了method ==
"radix"
,index.return
所有人都支持na.last
模式。其他方法仅支持index.return
当na.last
是NA
。索引向量指的是元素编号删除 NA
后: 看order
如果你想要原始元素编号。
除了已排序的名称之外,所有属性都从返回值中删除(参见 Becker 等人,1988,第 146 页)。 (如果指定了partial
,则名称也会被删除。)请注意,这意味着返回的值没有类,除了因子和有序因子(它们经过特殊处理,其结果将转换回原始类)。
例子
require(stats)
x <- swiss$Education[1:25]
x; sort(x); sort(x, partial = c(10, 15))
## illustrate 'stable' sorting (of ties):
sort(c(10:3, 2:12), method = "shell", index.return = TRUE) # is stable
## $x : 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 12
## $ix: 9 8 10 7 11 6 12 5 13 4 14 3 15 2 16 1 17 18 19
sort(c(10:3, 2:12), method = "quick", index.return = TRUE) # is not
## $x : 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 12
## $ix: 9 10 8 7 11 6 12 5 13 4 14 3 15 16 2 17 1 18 19
x <- c(1:3, 3:5, 10)
is.unsorted(x) # FALSE: is sorted
is.unsorted(x, strictly = TRUE) # TRUE : is not (and cannot be)
# sorted strictly
## Not run:
## Small speed comparison simulation:
N <- 2000
Sim <- 20
rep <- 1000 # << adjust to your CPU
c1 <- c2 <- numeric(Sim)
for(is in seq_len(Sim)){
x <- rnorm(N)
c1[is] <- system.time(for(i in 1:rep) sort(x, method = "shell"))[1]
c2[is] <- system.time(for(i in 1:rep) sort(x, method = "quick"))[1]
stopifnot(sort(x, method = "shell") == sort(x, method = "quick"))
}
rbind(ShellSort = c1, QuickSort = c2)
cat("Speedup factor of quick sort():\n")
summary({qq <- c1 / c2; qq[is.finite(qq)]})
## A larger test
x <- rnorm(1e7)
system.time(x1 <- sort(x, method = "shell"))
system.time(x2 <- sort(x, method = "quick"))
system.time(x3 <- sort(x, method = "radix"))
stopifnot(identical(x1, x2))
stopifnot(identical(x1, x3))
## End(Not run)
参考
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988). The New S Language. Wadsworth & Brooks/Cole.
Knuth, D. E. (1998). The Art of Computer Programming, Volume 3: Sorting and Searching, 2nd ed. Addison-Wesley.
Sedgewick, R. (1986). A new upper bound for Shellsort. Journal of Algorithms, 7, 159-173. doi:10.1016/0196-6774(86)90001-5.
Singleton, R. C. (1969). Algorithm 347: an efficient algorithm for sorting with minimal storage. Communications of the ACM, 12, 185-186. doi:10.1145/362875.362901.
也可以看看
‘Comparison’了解字符串的整理方式。
order
用于对多个变量进行排序或重新排序。
is.unsorted
。 rank
。
相关用法
- R solve 求解方程组
- R source 从文件、连接或表达式中读取 R 代码
- R socketSelect 等待套接字连接
- R strsplit 分割字符向量的元素
- R seq.Date 生成规则的日期序列
- R search 给出 R 对象的搜索路径
- R scan 读取数据值
- R sprintf 使用 C 风格字符串格式化命令
- R stop 停止函数执行
- R sign 标志函数
- R svd 矩阵的奇异值分解
- R strtoi 将字符串转换为整数
- R sQuote 引用文字
- R switch 选择替代方案列表之一
- R substitute 替换和引用表达式
- R strrep 重复字符向量的元素
- R split 分组并重新集合
- R slice.index 数组中的切片索引
- R standardGeneric 形式化方法系统 – 调度 S4 方法
- R sequence 创建序列向量
- R startsWith 字符串是否以另一个字符串开头或结尾?
- R system.file 查找 R 系统文件的名称
- R sample 随机样本和排列
- R strwrap 将字符串换行以设置段落格式
- R seek 重新定位连接的函数
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Sorting or Ordering Vectors。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。