[英]I am learning quick sort using javaScript and and the code is not working where i am making mistake?
它以数组作为输入,并使用快速排序返回已排序的数组。 我遇到了超出最大调用堆栈大小的错误, 我尝试了不同的方法,但我认为它是我自己提出的一种方法。我应该采取哪种不同的方法?
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)。
选择数据透视:我们选择数据透视作为数组的最后一个索引。
调用分区函数:计算完枢轴后,我们将枢轴发送到分区函数。 在分区函数中,我们传递数组,数据透视表索引(left,right)。
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.