2016-02-01 3 views
-2

Это моя функция и нужна помощь заставить его работать с 2D массив таким образом, когда я прохожуКак отсортировать 2D массив в JavaScript, используя пузырьковой сортировки

[[39, 43, 32], [300, 44, 1]]

Он возвращает

[[1, 32, 39], [43, 44, 300]]

function bubbleSort(items) { 
    var length = items.length; 
    for (var i = 0; i < length; i++) { 
    for (var j = 0; j < (length - i - 1); j++) { 
     if(items[j] > items[j+1]) { 
     var tmp = items[j]; 
     items[j] = items[j+1]; 
     items[j+1] = tmp; 
     } 
    } 
    }   

}

+1

Что конкретно не работает? Можете ли вы привести примеры результатов, которые вы получаете? – BurningLights

+0

Какая логика - ваш желаемый результат на основе? Ваши желаемые возвращаемые значения не отсортированы по пузырькам, вы полностью изменили значения массивов. Если бы это была простая сортировка пузырьков подэлементов, у вас было бы [[32,39,43], [1,44,300]] ' –

ответ

0

Для точный пример, который вы дали решению, может состоять в том, чтобы просто объединить два под-массива, отсортировать результат и разделить результат на два подмассива.

function bubbleSort(items) { 
    var length = items.length; 
    for (var i = 0; i < length; i++) { 
    for (var j = 0; j < (length - i - 1); j++) { 
     if(items[j] > items[j+1]) { 
     var tmp = items[j]; 
     items[j] = items[j+1]; 
     items[j+1] = tmp; 
     } 
    } 
    } 
    return items; 
} 

var a = [ [39, 43, 32], [300, 44, 1] ]; 
var a2 = bubbleSort(a[0].concat(a[1])); 
a[0] = a2.slice(0,3); 
a[1] = a2.slice(3,6); 

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

0

Вероятно, лучшим решением является первой «unnest» вложенной массив в плоский массив, разбирайтесь, и скопируйте значения обратно в гнездовой массив:

function bubbleSortNested(items) { 
    // create a flat copy of the nested items array 
    var flat = []; 
    for (var i = 0; i < items.length; i++) { 
    flat = flat.concat(items[i]); 
    } 
    // sort flat array 
    for (var i = 0; i < flat.length; i++) { 
    for (var j = 0; j < (flat.length - i - 1); j++) { 
     if(flat[j] > flat[j+1]) { 
     var tmp = flat[j]; 
     flat[j] = flat[j+1]; 
     flat[j+1] = tmp; 
     } 
    } 
    } 
    // copy sorted flat array back into original nested array 
    for (var i = items.length-1; i>=0; i--) { 
    items[i] = flat.slice(-items[i].length); 
    flat.length -= items[i].length; 
    } 
    return items; 
} 

res = bubbleSortNested([ [39, 43, 32], [300, 44, 1] ]); 
console.log(res); 

Выход:

[[1, 32, 39], [43, 44, 300]]

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