Название может быть путаным и прощать меня, поскольку я все еще новичок. Это часть задания HW для школы, и хотя я не ищу ответа прямо, мне нужен толчок в правильном направлении или любая помощь вообще. Итак, на вопрос ...Как объединить отсортированные массивы внутри массивов в третий отсортированный массив
Мне нужно создать простую программу на основе кода в классе, чтобы объединить несколько отсортированных массивов в один отсортированный массив для вывода на экран. Массивы жестко закодированы как «тестовые примеры», чтобы раскомментировать и проверить. Направления сопроцессоров следующие:
Используя программу слияния, разработанную в классе (см. Прикрепленную) в качестве базы, создайте версию, которая объединит 0 (ноль) в n массивов чисел. Подсказки: Сортируйте массивы перед слиянием Используйте метод shift для удаления первого элемента в массиве (arrayName.shift()) Чтобы создать массив массивов ---> var x = []; var y = []; var z = [x, y];
EDIT: Я отправил инструктору по электронной почте решение, основанное на ответе, предоставленном @cpugourou, и его ответ состоял в том, что он не примет это решение. Пункт домашней работы состоит в том, чтобы вручную объединить эти массивы.
Ниже оригинал «Объединить программу», которую мы разработали в классе
"use strict"; // reduces chance for error
/*
there are 2 arrays here and this program will merge them.
Your job is to merge zero or more arrays. Test cases include:
1. arrays with no elements: x = [], y = [], z = [], ...
2. 2 arrays - one with elements and one without: x = [], y = [200, 39,1]
3. 4 arrays: x = [5, 1, 0], y = [], z = [78, 3], w = [4, 34]
*/
var x = [ 12, 5, 1], y = [ 13, 2, 3], z = []; // x and y are input and, after processing, z has the merged arrays
var ix = 0, iy = 0, iz = 0; // indexes to the next element
// The following sorts the arrays in ascending sequence
x.sort(function(a, b){return a - b});
y.sort(function(a, b){return a - b});
while (ix < x.length || iy < y.length){ // while arrays x or y have elements
if (ix < x.length && iy < y.length){ // if both have elements, choose the lowest element
if (x[ix] <= y[iy]){ // is the current element in array x less than the current element in y?
z[iz] = x[ix]; // choose x
iz++; // point to the next space in z
ix++; // ditto x
} else{ // choose y
z[iz] = y[iy];
iz++; // next
iy++; // next
}
} else if (ix < x.length){ // if only one has elements is it x?
for (ix; ix < x.length; ix++){ // if so, move the rest of x to z
z[iz] = x[ix]; // copy current element in x
iz++; // next z ... no need to increment x because the for loop does it
}
} else if (iy < y.length){ // if only y has elements
for (iy; iy < y.length; iy++){ // move the rest of y to z
z[iz] = y[iy]; // copy
iz++; // increment z's pointer
}
}
}
// display the resulting merged elements in the web page
var result = "<ul>";
for (var i in z){
result += "<li>" + z[i] + "</li>"
}
result += "</ul>"
document.getElementById("placeAnswerHere").innerHTML=result;
/*
Things to think about:
. This code is hard wired to merge only 2 arrays
. You will need to create an array containing all arrays to be merged. e.g. q = [x, y, z, w, and more]
. Your loop will need to find the smallest element in any of the arrays in q and move it to z (the resultant array)
. There is a method shift() to strip the first element from an array (e.g. x.shift(); removes the first element in array x)
. This is like making a pile of cafeteria trays from a variable numbers of tray stacks.
. Remember to sort all arrays first
*/
Так что мой новый вопрос становится, как это сделать, не написав кучу запутанного кода?
Вам нужно объединить все массивы в один массив, удалить дубликаты, а затем отсортировать от низкого до высокого правильно? – Darkrum
Да, я не думаю, что мы должны удалить дубликаты. –
Если у вас есть функция слияния (a, b) ', которая работает с двумя массивами, вы можете тривиально расширить ее до четырех массивов, выполнив' merge (a, merge (b, merge (c, d))). Если у вас есть произвольное множество массивов, используйте цикл. – Bergi