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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。