2017-09-06 128 views
0

我目前正試圖在JavaScript中的數組實現快速排序。我有整體佈局,但由於某種原因遞歸不起作用。它似乎已經爲代碼的第二次迭代工作,但在此之後,它似乎只是搞砸了。不知道我做錯了什麼。在我的quicksort遞歸

function main() { 
 
    var type = "quicksort" 
 
    var testArray = [9, 6, 5, 0, 8, 2, 4, 7]; 
 

 
    quickSort(testArray, 0, testArray.length - 1); 
 
    for (var i = 0; i < testArray.length; i++) { 
 
    console.log(testArray[i]); 
 
    } 
 

 
} 
 

 
function quickSort(array, start, end) { 
 
    var type = "quicksort" 
 
    var pIndex; 
 

 
    if (start <= end) { 
 
    pIndex = partition(array, start, end); 
 
    quickSort(array, start, pIndex - 1); 
 
    quickSort(array, pIndex + 1, end); 
 
    } 
 

 

 
} 
 

 
function partition(array, start, end) { 
 
    var x = end; 
 
    console.log(start); 
 
    var i = start - 1; 
 
    var temp; 
 

 
    for (var j = 0; j < end - 1; j++) { 
 
    if (array[j] <= x) { 
 
     i++; 
 
     temp = array[j]; 
 
     array[j] = array[i]; 
 
     array[i] = temp; 
 
     temp = 0; 
 

 

 
    } 
 
    } 
 

 
    temp = array[i + 1]; 
 
    array[i + 1] = array[x]; 
 
    array[x] = temp; 
 
    temp = 0; 
 

 
    return i + 1; 
 
} 
 

 
main();

+0

「搞砸」是什麼意思?它做錯了什麼? – dman2306

+0

至少有一個更正,'var x = array [end]'。注意,使用'end'這個名字會讓人產生誤解,也許會把它改成'last'。子數組的最後一個元素的典型名稱用法是'array [end-1]'或'array [last]'。 – rcgldr

回答

0

的錯誤是

@function QUICKSORT

//if (start <= end) 
    // should be 
    if (start < end) 

@function分區

//for (var j = 0; j <= end - 1; j++) { 
// if (array[j] <= x) { 
// Should be 
for (var j = start; j <= end - 1; j++) { 
    if (array[j] <= array[x]) { 

下面的代碼應該工作。

function main() { 
    var type = "quicksort" 
    var testArray = [9, 6, 5, 0, 8, 2, 4, 7]; 

    quickSort(testArray, 0, testArray.length - 1); 
    for (var i = 0; i < testArray.length; i++) { 
    console.log(testArray[i]); 
    } 

} 

function quickSort(array, start, end) { 
    var type = "quicksort"; 
    var pIndex; 

    if (start < end) { 
    pIndex = partition(array, start, end); 
    quickSort(array, start, pIndex - 1); 
    quickSort(array, pIndex + 1, end); 
    } 


} 

function partition(array, start, end) { 
    var x = end; 
    console.log(start); 
    var i = start - 1; 
    var temp; 

    for (var j = start; j <= end - 1; j++) { 
    if (array[j] <= array[x]) { 
     i++; 
     temp = array[j]; 
     array[j] = array[i]; 
     array[i] = temp; 
     temp = 0; 
    } 
    } 

    temp = array[i + 1]; 
    array[i + 1] = array[x]; 
    array[end] = temp; 
    temp = 0; 

    return i + 1; 
} 

main(); 

希望它有幫助!

+0

完美!非常感謝。我很感激幫助 –

1

有些錯誤:

if (start <= end) {沒有必要治療情況start = end

如何for (var j = 0從0開始的時候範圍從啓動開始?

if (array[j] <= x) {您將索引與項目值比較?