在快速排序实现中的整数交换期间递增/递减

时间:2013-07-11 23:23:22

标签: c# sorting quicksort

我正在尝试在C#中实现快速排序。我发现代码与网络上的代码非常相似:

public void Sort(List<int> list, int low, int high) 
    {
        int i = low;
        int j = high;

        IComparable pivot = list[(low + high) / 2];

        while (i <= j)
        {
            while (list[i].CompareTo(pivot) < 0)
            {
                i++;
            }
            while (list[j].CompareTo(pivot) > 0)
            {
                j--;
            }
            if (i <= j)
            {
                int temp = list[i];
                list[i++] = list[j]; // ??
                list[j--] = temp; // ??
            }
        }

        if (j > low)
        {
            Sort(list, low, j);
        }
        if (i < high)
        {
            Sort(list, i, high);
        }            
    }

代码工作正常但我无法理解为什么在交换list [i]和list [j]中的整数时i和j需要递增和递减。

我是排序算法的新手。 我会非常感谢任何见解......

1 个答案:

答案 0 :(得分:2)

交换本身没有完成递增和递减,但是为了使指针到位,以便排序将在下一次迭代中继续下一对元素。

请考虑以下示例。

4    1    7    3    5    4    8    1    9
          ↑         ↑              ↑
          i       pivot            j

i的值大于pivot,而j的值更小,使其符合互换条件。但是,一旦交换准备就绪,重新比较相同的两个元素是没有意义的,因为我们已经知道它们在正确的位置。因此,我们将ij作为同一操作的一部分进行。

4    1    1    3    5    4    8    7    9
               ↑    ↑         ↑
               i  pivot       j

编辑:操作是后缀,意味着在分配后完成。以下内容相同:

int temp = list[i];
list[i] = list[j];
i = i + 1;
list[j] = temp;
j = j + 1;