繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM