繁体   English   中英

用C编程的快速排序

[英]Quick sort programmed in C

我正在阅读K&R的ANSIC。 我遇到了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);
}

首先,您对交换功能有一个小的误解。 假设该函数的原型是-

swap(int array[], int i, int j)

swap函数在位置array [i]和array [j]处交换数字。 因此,swap函数交换数组中的元素。 所以,线-

swap(v, left, (left + right) / 2);

表示数组中的中间元素与最左边的元素交换。 显然,快速排序将中间元素作为关键。 此交换对局部变量或参数没有影响。 根据您的数据输入示例,即使交换后,“ left”的值也等于0,right的值等于“ 8”。 这是您感到困惑的地方。 数组的元素被交换,而不是变量的值。 所以,现在,这条线-

last = left;

使得'last'指向枢轴的位置('left'),所以这里'last'的值= 0而不是4。因此,循环

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

从i = 1到8。顺便说一句,您忘记了分号..! 然后,线,

if(v[i] < v[left])

检查当前元素('v [i]')是否小于枢轴('v [left]')。 然后,相应地交换行中的较小元素,

 swap(v, ++last, i);

从位置(最后+1)到它增加到的位置。 因此,“最后一个”左侧的元素小于枢轴,而右侧的元素则更大。 我认为您遗漏了另一行,在执行算法的过程中,我们将枢轴移回到了中间位置[v [left]'。 然后,递归调用发挥作用。 如果您正在寻求Quicksort的帮助, 是一个不错的起点!

希望我的回答对您有所帮助,如果有,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM