2016-12-11 70 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()所需要的交错也删除名称。