【问题标题】:Quick sort programmed in C用 C 编写的快速排序
【发布时间】:2014-08-23 10:38:12
【问题描述】:

我正在阅读 K&R 的 ANSI C。我遇到了 qsort 程序。我需要一点帮助。假设我有 9 个索引为 0->8 的元素。请阅读 cmets 看看我的理解是否正确。非常感谢您的努力

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);
}

【问题讨论】:

标签: c quicksort


【解决方案1】:

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

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);

从位置 (last + 1) 直到它递增到的任何位置。因此,“last”左侧的元素小于枢轴,右侧的元素更大。我认为你错过了另一条线,我们将枢轴带回中间,在算法执行期间位于位置 'v[left]' 处。然后,递归调用发挥它们的作用。如果您正在寻求快速排序方面的帮助,this 是一个不错的起点!

希望我的回答对你有所帮助,如果有,请告诉我..! ☺

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    相关资源
    最近更新 更多