分区在我的快速排序功能中不起作用
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);
【讨论】:
以上是关于分区在我的快速排序功能中不起作用的主要内容,如果未能解决你的问题,请参考以下文章