将数组作为输入 并使用快速排序返回已排序的数组 我收到超出最大呼叫堆栈大小的错误 我尝试了不同的方法,但我认为它是我最终提出的一种方法 我应该采取什么不同的方法?
function quickSort(arr){
// grab the pivot from the start of the array
let i = 0;
// store the current pivot index in a variable
let pivot = arr[i];
// end variable of array.
let j = 0;
let k = j;
*// loop through the array from the start until the end*
function helper(arry){
*// if the pivot is greater than the current element ,increment the pivot index variable and then swap the current element with the element at the pivot index*
while(i < j && i<arry.length){
if(pivot > arry[k]){
let swap = arry[i];
arry[i] = arry[k]
arry[k] = swap
j++;
}
k++;
if(j == k){
i++;
}
}
helper(arry)
if(arry.length == i ){
return
}
}
helper(arr);
return arr;
*// Swap the starting element(ie; the pivot) with the index*
}
答案 0 :(得分:0)
第1步:您必须选择一个枢轴。这可以是随机选择的,也可以是中间的。在这里,我们选择数组的最后一个元素。
步骤2:将所有小于枢轴值且大于枢轴值的项目放在左侧。
第3步:在枢轴的左侧和右侧重复第2步(选择一个枢轴,将所有小于枢轴的项目放到左侧,将较大的项放到右侧)
解释代码 调用快速排序:传递数组并将左右传递给quickSort函数。对于第一次调用,左为第一个元素的索引为0,右为最后一个元素的索引为-1。
选择数据透视:我们选择数据透视作为数组的最后一个索引。
调用分区函数:计算枢轴后,我们将枢轴发送到分区函数。在分区函数中,我们传递数组,左右枢轴索引。
partitionIndex:在分区功能中,我们将小于枢轴值的所有项目向左移动,大于枢轴值的所有项目向右移动。我们必须跟踪分区的位置。这样我们就可以在下一步中将数组分为两部分。通过使用partitionIndex变量可以完成对数组进行分区的索引的跟踪。保留初始值。
交换函数:这只是交换数组值的辅助函数。
移动元素:我们从左侧开始for循环,如果值小于枢轴值,则将其与partitionIndex的位置交换,并增加partitionIndex的值。如果值更大,我们什么也不做。我们一直走到最后一个元素之前的那个元素(记住最后一个元素是枢轴)
位置枢轴将所有最小的元素向左移动后,我们将最后一个元素(枢轴值)与partitionIndex交换。这样,当对整个数组进行排序时,枢轴就位于它应该位于的位置。由于保留给它的所有元素都较小,保留给它的所有元素都较大。函数分区结束,返回partitionIndex
重复该过程:现在回到quickSort函数。当您获得partitionIndex时,将quickSort应用于数组的左侧和数组的右侧。继续做,直到左边小于右边。
function quickSort(arr, left, right){
var len = arr.length,
pivot,
partitionIndex;
if(left < right){
pivot = right;
partitionIndex = partition(arr, pivot, left, right);
//sort left and right
quickSort(arr, left, partitionIndex - 1);
quickSort(arr, partitionIndex + 1, right);
}
return arr;
}
function partition(arr, pivot, left, right){
var pivotValue = arr[pivot],
partitionIndex = left;
for(var i = left; i < right; i++){
if(arr[i] < pivotValue){
swap(arr, i, partitionIndex);
partitionIndex++;
}
}
swap(arr, right, partitionIndex);
return partitionIndex;
}
function swap(arr, i, j){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}