分区在我的快速排序功能中不起作用

Posted

技术标签:

【中文标题】分区在我的快速排序功能中不起作用【英文标题】: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))

【问题讨论】:

【参考方案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);

【讨论】:

以上是关于分区在我的快速排序功能中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

mysql 订单项在我的查询中不起作用

回发后,我的 JavaScript 函数在 ASP.NET 中不起作用

排序在Powershell函数中不起作用[重复]

退格在 sqlplus 命令行中不起作用

Javascript 自动完成功能在 ascx 中不起作用

DataTables 函数在 Codeigniter 中不起作用