我正在使用javaScript学习快速排序,而代码在我犯错误的地方不起作用



它将数组作为输入并使用快速排序返回一个已排序的数组 我收到了一个超过最大调用堆栈大小的错误 我尝试了不同的方法,但我认为这是我得到的最接近的方法我应该采取什么不同的方法

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* 
}

步骤1:您必须选择一个枢轴。这可以是随机选择的,也可以是中间的。在这里,我们选择数组的最后一个元素。

步骤2:将所有小于枢轴值的项目放在左边,将所有大于枢轴值的项放在右边。

步骤3:对枢轴的左侧和右侧重复步骤2(选择一个枢轴,将所有小于枢轴的项目向左放置,将所有大于枢轴的项目向右放置)

解释代码调用快速排序:传递数组,然后左右传递给quickSort函数。对于第一个调用,left将是第一个元素的索引,它为0,right将是最后一个元素的指数,它的长度为-1。

选择枢轴:我们选择枢轴作为数组的最后一个索引。

调用分区函数:在计算了pivot之后,我们将pivot发送给分区函数。在分区函数中,我们传递array、pivot index、left和right。

partitionIndex:在partition函数中,我们将所有小于pivot值的项向左移动,将所有大于pivot的项向右移动。我们必须跟踪隔板的位置。这样我们就可以在下一步中将阵列拆分为两部分。通过使用partitionIndex变量来跟踪对数组进行分区的索引。则保留初始值。

交换函数:这只是一个交换数组值的辅助函数。

move elements:我们从左边开始一个for循环,如果值小于pivot值,我们将其与partitionIndex的位置交换,并增加partitionIndex的值。如果价值更大,我们什么都不做。我们一直走到最后一个元素之前的元素(记住最后一个是枢轴)

place pivot将所有最小的元素向左移动后,我们用partitionIndex交换最后一个元素(pivot值)。通过这样做,当对整个数组进行排序时,枢轴位于它应该位于的位置。左边的所有元素都更小,右边的所有元素也更大。函数分区结束,返回分区索引

重复这个过程:现在回到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;
}

相关内容

最新更新