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

时间:2019-01-25 14:40:59

标签: javascript arrays recursion quicksort

将数组作为输入 并使用快速排序返回已排序的数组 我收到超出最大呼叫堆栈大小的错误 我尝试了不同的方法,但我认为它是我最终提出的一种方法 我应该采取什么不同的方法?

     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 个答案:

答案 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;
}