我正在尝试在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需要递增和递减。
我是排序算法的新手。 我会非常感谢任何见解......
答案 0 :(得分:2)
交换本身没有完成递增和递减,但是为了使指针到位,以便排序将在下一次迭代中继续下一对元素。
请考虑以下示例。
4 1 7 3 5 4 8 1 9
↑ ↑ ↑
i pivot j
i
的值大于pivot
,而j
的值更小,使其符合互换条件。但是,一旦交换准备就绪,重新比较相同的两个元素是没有意义的,因为我们已经知道它们在正确的位置。因此,我们将i
和j
作为同一操作的一部分进行。
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;