当枢轴不是第一个元素时计算比较
Posted
技术标签:
【中文标题】当枢轴不是第一个元素时计算比较【英文标题】:Counting Comparisons When The Pivot Is Not The First Element 【发布时间】:2016-11-08 04:00:19 【问题描述】:我尝试实现快速排序算法,但不同的枢轴似乎不起作用。 当枢轴元素不是第一个元素时,它总是以递归循环结束,从而导致变量 i 从数组中脱落并再次使用完整数组调用自身而没有任何变化的崩溃。我认为错误是比较 toSort[j] 与枢轴值,或与另一个元素交换后的第一个元素。
public static void quickSort(int[] toSort, int l, int r)
if(r - l <= 1)return;
counter += r - l - 1;
int p = choosePivot(l, r);
int pivot = toSort[p];
int oldP = toSort[p];
toSort[p] = toSort[l];
toSort[l] = oldP;
int i = l + 1;
for(int j = l + 1; j < r; j++)
if(toSort[j] < pivot)
int swap = toSort[j];
toSort[j] = toSort[i];
toSort[i] = swap;
i++;
oldP = toSort[i - 1];
toSort[i - 1] = toSort[l];
toSort[l] = oldP;
quickSort(toSort, l, i);
quickSort(toSort, i, r);
public static int choosePivot(int m, int n)
return n - 1;
//return m;
【问题讨论】:
【参考方案1】:问题是对quickSort()
的递归调用没有收敛。最后两行的细微变化会像魔术一样起作用。
public static void quickSort(int[] toSort, int l, int r)
if(r - l <= 1)return;
counter += r - l - 1;
int p = choosePivot(l, r);
int pivot = toSort[p];
int oldP = toSort[p];
toSort[p] = toSort[l];
toSort[l] = oldP;
int i = l + 1;
for(int j = l + 1; j < r; j++)
if(toSort[j] < pivot)
int swap = toSort[j];
toSort[j] = toSort[i];
toSort[i] = swap;
i++;
oldP = toSort[i - 1];
toSort[i - 1] = toSort[l];
toSort[l] = oldP;
quickSort(toSort, l, i-1);
quickSort(toSort, i, r);
public static int choosePivot(int m, int n)
return n - 1;
//return m;
您可以查看Ideone link 以获取更新的代码。
【讨论】:
非常感谢!这是一个巨大的帮助! @hello-world 我以为你最近自己想通了。!上述解决方案有效吗?以上是关于当枢轴不是第一个元素时计算比较的主要内容,如果未能解决你的问题,请参考以下文章