2016-12-11 103 views
0

我想以增加的方式對數組進行排序,以最大和最小數目的差異來排序。 沒有循環。按兩位數的差值排序

我想我需要一種我可以給一個條件但我找不到的方法。

事情是這樣的:

sort(arr, decreasing = FALSE, by = max(a) - min(a)) 
sort(arr, decreasing = FALSE, condition = max(a) - min(a)) 

數組排序要這個樣子。與第一個和第二個數字的差值對於所有數字int中的最小值,第二個和第三個的差值是第二小的......

例如://我的事情是這樣的

陣列(22,2,32,3,6,9,7,23,11,13)

sorted_array(9,11,7,13,6,22,3,23,2,32 )

我的另一種方法是構建排序後的數組,放在最後一個位置後的最大數,即最小,第二大,第二小,...

抱歉,不好解釋。

+0

這是不完全清楚你想要做什麼。預期排序的描述似乎沒有詳細說明它。 –

+0

我很抱歉,但我的英語不太好,我找不到更好的方式來解釋它。 – Nootor

+0

Jep,我也不明白你在找什麼。你提到你不希望循環解決你的問題,但也許你可以提供一個循環來理解你想要的。 –

回答

2

這是一個想法如何工作,但只適用於長度均勻的陣列。如果您想使用此解決方案並且陣列不均勻,則可以使用if。我需要承認它必須是緊急的,我想用這樣的結構代替循環。

x <- c(22, 2, 32, 3, 6, 9, 7, 23, 11, 13) 
n <- length(x) 
m <- floor(n/2) 

rev(
as.numeric(
    rbind(
    sort(x)[n-c(0:(m-1))], 
    sort(x)[1:m] 
) 
) 
) 
+0

謝謝,我認爲這可能對我有用。是的,甚至我忘了提到它的長度。 – Nootor

0

我試圖想出一個非for-loop結構。所以我首先對序列進行排序,然後通過命名前半部分「a_N」和後半部分「b_N」,然後將它摺疊成兩列矩陣,並將前半部分翻轉,最後將其讀出與c展開:

my_arr <- c(22, 2, 32, 3, 6, 9, 7, 23, 11, 13) 
names(my_arr) <- paste0(rep(c("a","b"), each=length(my_arr)/2), order(my_arr)) 
c(rbind(sort(my_arr[grep("a", names(my_arr))], decreasing=TRUE), #first half 
      my_arr[grep("b", names(my_arr))])) # second half 
#[1] 9 11 7 13 6 22 3 23 2 32 

你可以看到矩陣的中間值:

rbind(sort(my_arr[grep("a", names(my_arr))], decreasing=TRUE), my_arr[grep("b", names(my_arr))]) 
    a5 a4 a3 a2 a1 
[1,] 9 7 6 3 2 
[2,] 11 13 22 23 32 

而且由於R矩陣列順序讀出你得到c()所需要的交錯也刪除名稱。