2016-10-11 2 views
0

Название может быть путаным и прощать меня, поскольку я все еще новичок. Это часть задания 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 
*/ 

Так что мой новый вопрос становится, как это сделать, не написав кучу запутанного кода?

+0

Вам нужно объединить все массивы в один массив, удалить дубликаты, а затем отсортировать от низкого до высокого правильно? – Darkrum

+0

Да, я не думаю, что мы должны удалить дубликаты. –

+0

Если у вас есть функция слияния (a, b) ', которая работает с двумя массивами, вы можете тривиально расширить ее до четырех массивов, выполнив' merge (a, merge (b, merge (c, d))). Если у вас есть произвольное множество массивов, используйте цикл. – Bergi

ответ

1

самый быстрый и самый короткий я могу думать (unduplication бонус добавляется):

var x = [5, 1, 0], y = [2, 5, 0], z = [78, 3, 1], w = [4, 34]; 

function sortNumber(a,b) { 
    return a - b; 
} 
function uniq(a) { 
    return Array.from(new Set(a)); 
} 

var d = uniq(x.concat(y,z,w).sort(sortNumber)); 
/* [0, 1, 2, 3, 4, 5, 34, 78] */ 
+0

Ah!Вы избили меня до этого ... Кроме того, ваш учитель супит. Как действительно глупо. – Darkrum

+0

@Darkrum Что за глупость в задаче? – Bergi

+0

самым важным правилом следовать за любым языком, который вы используете, является избежание кодов спагетти. Это один из лучших кодов спагетти, который я когда-либо видел. В моем мире ваш учитель был бы уволен немедленно, чтобы преподавать такие глупые вещи. – cpugourou

0

Хотя ответа работ cpugourou, он не появляется, чтобы соответствовать заявленной присваивание HW. Что касается назначения HW, одна проблема, непонятная мне, заключается в том, как создать общий массив массивов (например, для (i = 0; i < n; i ++) aa [i] = new Array (...)), который похоже, противоречат утверждению проблемы HW, что массивы являются жестко закодированными тестовыми примерами.

Игнорирование вопроса о том, как создать общий массив жестко закодированных массивов, как только у вас будет массив отсортированных массивов, назначение HW, похоже, хочет, чтобы вы реализовали n-мерное слияние с использованием массива массивов. Это означает, что найти массив в массиве массивов имеет наименьший элемент и перемещение этого элемента в выходной массив (добавление к выходному массиву, удаление из входного массива). Когда один из n массивов опустеет, этот массив удаляется из массива массивов, и вы продолжаете слияние n-1. Повторяйте это до тех пор, пока не останется только 1 массив, где оставшаяся часть этого последнего массива просто копируется (или перемещается) в выходной массив.

Общая оптимизация для слияния n-способов заключается в использовании кучи, но я сомневаюсь, что вы ожидаете использовать кучу для этого назначения HW.

+0

Назначение HW по-прежнему является фиктивным, и код ужасен, а учитель по-прежнему глуп. OP, вероятно, все еще получит F, потому что эго учителя будет повреждено, когда он поймет, что он застрял в прошлом. Но опять же, как это делают большинство классов CS университета. – Darkrum

+0

@Darkrum - n способами слияния, обычно использующие кучу, довольно распространены для внешних сортировок, таких как сортировка gnu, которая сначала создает набор отсортированных временных файлов, а затем повторяет выполнение 16 способов слияния во временных файлах до окончательного слияния, которое производит отсортированный выходной файл. – rcgldr

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