我正在阅读K& R的ANSI C.我遇到了qsort计划。我想要一些帮助。假设我有9个索引为0-> 8的元素。请阅读评论,看看我是否理解它是否正确。非常感谢您的努力
void qsort(int v[] , int left, int right)
{
int i, j, last;
void swap(int v[], int i, int j);
if(left >= right) /*if the array has only one element return it*/
return;
swap(v,left, (left+right)/2); /* now, left=(left+right)/2= 0+8/2= 4 we have 4 as left*/
last= left; /* putting left = last of the first partition group i.e. last=4*/
for(i=left+1; i<=right,i++) /* now looping from 4+1=5 to 8 with increment of 1*/
if(v[i] < v[left]) /*if value at 5th is less than value at 4th */
swap(v, ++last, i);
我在最后一个交换步骤中遇到问题。因为我的值表明交换++ 4即i
,即4 + 1 = 5(用5?交换5位)。我怎么能理解这个?必须有4到5之间的交换,而不是5和5?
代码继续
swap(v,left, last);
qsort(v,left,last-1);
qsort(v,last+1,right);
}
答案 0 :(得分:0)
首先,您对交换功能有一个小的误解。让我们说这个函数的原型是 -
swap(int array[], int i, int j)
交换函数交换位置数组[i]和数组[j]的数字。因此,交换函数交换数组中的元素。那么,行 -
swap(v, left, (left + right) / 2);
表示数组中的中间元素与最左边的元素交换。显然,快速排序将中间元素作为支点。此交换对局部变量或参数没有影响。根据您的数据输入示例,&#39; left&#39;的值= 0,即使在交换之后,右=&#39; 8&#39;的值。这是你感到困惑的地方。交换数组的元素,而不是变量的值。那么,现在,行 -
last = left;
制作,&#39;最后&#39;指向枢轴的位置(&#39; left&#39;),所以这里的值是&#39; last&#39; = 0不是4.所以,循环,
for(i = left + 1; i <= right; i++)
从i = 1到8运行。顺便说一下,你忘记了分号..!然后,行,
if(v[i] < v[left])
检查当前元素(&#39; v [i]&#39;)是否小于数据透视(&#39; v [left]&#39;)。然后,相应地交换较小的元素,如行,
swap(v, ++last, i);
从位置(最后+ 1)直到它增加到的位置。那么,&#39;最后的左边的元素是&#39;小于枢轴,右边的元素更大。我想你错过了另一条线,在那里我们将枢轴带回到位于中间位置的中间位置[左]&#39;在执行算法期间。然后,递归调用发挥作用。如果您正在寻求快速排序的帮助,this是一个很好的起点!
我希望我的回答对你有所帮助,如果有,请告诉我..! ☺