2016-12-11 3 views
0

Я хочу отсортировать массив по возрастанию, по разнице наибольшего и наименьшего числа. Без петель.Сортировка по разнице между двумя цифрами

Я думаю, что мне нужен вид, который я могу дать, но я не могу найти, как это сделать.

Что-то вроде этого:

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

отсортированный массив должен выглядеть следующим образом. Отличие от первого и второго числа является наименьшим для всех чисел в массиве, разница между вторым и третьим является вторым наименьшим ...

Пример: // Я делаю это как

массив (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

Я попытался придумать конструкцию, не предназначенную для контура. Поэтому я сначала отсортировал последовательность, а затем разделил ее на две половины, назвав первую половину «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(), который также удаляет имена ,

Смежные вопросы