【问题标题】:Partition not working in my quicksort function分区在我的快速排序功能中不起作用
【发布时间】:2019-09-09 07:58:10
【问题描述】:

我一直在研究这个问题,但我无法让我的分区函数工作。我递增起始值,直到它达到一个小于枢轴的值,反之亦然,我的结束指针。我用我的开始和端点交换值。然后我用我的开始和支点交换价值。我错过了什么吗?


function quickSort(arr, start, end) {
    if (start >= end) {
        return
    }


    let index = partition(arr, start, end)

    quickSort(arr, start, index - 1)
    quickSort(arr, index + 1, end)
    return arr
}

function partition(arr, start, end) {
    let pivotIndex = end 
    let pivotValue = arr[end]
    let endPointer = arr[end - 1] //end pointer start w/ value left of pivot

    while (start <= end) {
        if (arr[start] < pivotValue) {
            start++
        } else {
            swap(arr,start, endPointer)
        }
        if (arr[endPointer] > pivotValue) {
            endPointer--
        } else {
            swap(arr,start, endPointer)
        }
    }

    swap(arr,start, pivotIndex)
    return start


}

function swap(arr, a, b) {
    let temp = arr[a]
    arr[a] = arr[b]
    arr[b] = temp 
}

let arr = [0,5,2,1,6,3]
console.log(quickSort(arr, 0, arr.length - 1))

【问题讨论】:

    标签: javascript arrays quicksort partitioning


    【解决方案1】:

    配分函数似乎是 Hoare 的变体。有几个问题(endPointer 应该是 end-1,而不是 arr[end-1]; while (start

    function quicksort(a, lo, hi) {
      if(lo >= hi)
        return;
      var p = a[Math.floor(lo+(hi-lo)/2)];
      var i = lo - 1;
      var j = hi + 1;
      var t;
      while (true){
        while (a[++i] < p);
        while (a[--j] > p);
        if (i >= j)
          break;
        t = a[i];
        a[i] = a[j];
        a[j] = t;
      }
      quicksort(a, lo, j);
      quicksort(a, j+1, hi);
    }
    

    由于代码使用最后一个值作为枢轴值,因此另一种选择是 Lomuto 分区方案:

    function quicksort(a, lo, hi) {
      if(lo >= hi)
        return;
      var p = a[hi];
      var i = lo;
      var j;
      var t;
      for(j = lo; j < hi; j++){
        if(a[j] < p){
          t = a[i];
          a[i] = a[j];
          a[j] = t;
          i++;
        }
      }
      t = a[i];
      a[i] = a[hi];
      a[hi] = t;
      quicksort(a, lo, i-1);
      quicksort(a, i+1, hi);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 2015-10-28
      • 2017-10-07
      • 2017-03-29
      相关资源
      最近更新 更多