有人可以解释这种排序算法的作用吗?我无法遵循逻辑,它使用递归。中间项似乎很奇怪,并将其与第一个(顶部的第8行)交换。此外,在第一次迭代中,++last = i
,因此浪费了对swap的调用。
代码集last = left
,i = left + 1
,然后使用++last
调用swap()。这使last
等于i
!
/* qsort: sort v[left]...v[right] into increasing order */
void qsort(int v[], int left, int right)
{
int i, last;
if (left >= right) /* do nothing if array contains */
return; /* fewer than two elements */
swap(v, left, (left + right)/2); /* move partition elem */
last = left; /* to v[0] */
for (i = left + 1; i <= right; i++) /* partition */
if (v[i] < v[left])
swap(v, ++last, i);
swap(v, left, last); /* restore partition elem */
qsort(v, left, last-1);
qsort(v, last+1, right);
}
/* swap: interchange v[i] and v[j] */
void swap(int v[], int i, int j)
{
int temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
答案 0 :(得分:4)
代码中的注释非常有用。在开始时,选择“分区”元素并将其移动到数组的开头,以便后续交换不会触及它。然后所有剩余的元素都被部分排序,因此这个'partition'元素可以插入到排序数组的最后位置,这就是最后一次交换所做的事情(就在为左边和右边的部分调用递归之前)分区元素)。
有关算法的详细信息,请参阅Quick sort。