2012-07-24 5 views
0

Я пробовал целый день и, похоже, не могу понять, почему он не работает. Я думаю, что проблема заключается в моих навыках с языком JavaScript. Возможно, мне не хватало какой-то концепции передачи параметров. Не могли бы вы показать мне, где ошибка?Почему эта реализация скрипта jquery Sort Merge не работает?

Вот моя реализация, основанная на другой реализации, которую я написал год назад в C#, который можно найти here.

Так вот код (вы можете попробовать прямо на консоли Chromes, просто копировать/вставить, и он будет "работать"):

function merge(A, p, q, r){ 
    var n1 = q - p + 1; 
    var n2 = r - q; 

    var i = 0; 
    var j = 0; 

    var L = []; 
    while (i < n1){ 
     L.push(A[p + i++]); 
    } 

    var R = []; 
    while(j < n2){ 
     R.push(A[q + j++ + 1]); 
    } 

    L.push(Number.MAX_VALUE); 
    R.push(Number.MAX_VALUE); 

    i = 0; 
    j = 0; 

    var k = p; 
    while(k <= r){ 
     if(L[i] <= R[i]){ 
      A[k] = L[i]; 
      i = i + 1; 
     }else{ 
      A[k] = R[j]; 
      j = j + 1; 
     } 

     k = k + 1; 
    } 
} 

function mergeSort(A, p, r){ 
    console.log(A); 

    if(p < r){ 
     var q = Math.floor((p + r)/2); 

     mergeSort(A, p, q); 
     mergeSort(A, q + 1, r); 
     merge(A, p, q, r); 
    } 
} 

function testMergeSort(array){ 
    var p = 0; 
    var r = array.length - 1; 

    console.log("BEFORE: " + array); 

    mergeSort(array, p, r); 

    console.log("AFTER: " + array); 
    console.log("---------------------------------"); 
} 

testMergeSort([5, 2, 4, 7, 1, 3, 2, 6]); 
+0

Я не проверил ваш код должным образом, но могу сказать, что он слишком длинный. Объединение должно быть реализовано в гораздо меньших количествах. – kay

+0

@Kay; Алгоритм сортировки слиянием = 5 строк, остальное, как вы не заметили, - это тестовый код. Алгоритм слияния такой же, как описано в «Введение в алгоритмы» (http://www.amazon.com/Introduction-Algorithms-Second-Edition-Thomas/dp/0262032937). Вы также можете увидеть код здесь: http://renatogama.com/blog/imagens/algoritmo-de-merge.png – renatoargh

+0

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

ответ

8

Простой опечатка:

if(L[i] <= R[i]){ 

должны быть

if(L[i] <= R[j]){ 
+1

Эй, приятная находка. +1 –

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