快速排序索引问题

Quicksort index issue

本文关键字:问题 索引 快速排序      更新时间:2023-10-16

我正在尝试实现基本的快速排序功能。我对索引范围有点困惑

void q_sort(int * tab, int left, int right)
    {
      if(left < right)
        {
          int piv = left;
          for(int i = left+1; i <= right; ++i)
            if(tab[i] < tab[left])
              change(tab[++piv], tab[i]);
          change(tab[piv],tab[left]);
          q_sort(tab, left, piv-1);
          q_sort(tab, piv+1, right);
        }
    }

让我们取一个包含四个元素的数组。如果我用

调用function
q_sort(array, 0, 3)

似乎可以,但是如果我改变

for(int i = left+1; i < right; ++i)

和调用函数

q_sort(array, 0, 4)

不。

不是相同的范围吗?有什么意义?

由于q_sort是递归的,因此需要在两种上下文中理解其参数的含义:

  • 函数外部调用时,
  • 执行递归调用。

您在外部调用q_sort(array, 0, 4)中调整了int right参数,将右端处理为不包含,但递归调用q_sort(tab, left, piv-1)假设第三个参数包含。从表达式中删除-1来解决这个问题:

q_sort(tab, left, piv); // <<== Here
q_sort(tab, piv+1, right);