Quicksort索引问题

时间:2015-05-21 16:01:04

标签: c++ quicksort

我试图实现基本的快速排序功能。我对指数范围感到有些困惑。

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);

        }
    }

让我们采用四个元素的数组。如果我用

调用函数
q_sort(array, 0, 3)

它似乎有效,但如果我改变了行

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

并使用

调用函数
q_sort(array, 0, 4)

它没有。

它的范围是否相同?重点是什么?

1 个答案:

答案 0 :(得分:3)

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

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

您已调整外部调用int right中的q_sort(array, 0, 4)参数,将右端视为独占,但递归调用q_sort(tab, left, piv-1)假定第三个参数是包含。从表达式中删除-1以解决此问题:

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