快速代码理解

时间:2014-12-04 20:13:17

标签: c text quicksort

我有一个快速排序代码应该在文本上运行" B A T T A J U S" (忽略空白)。但我似乎不太了解代码。

 void quicksort (itemType a[], int l, int r)
 {
    int i, j; itemType v;
    if (r>l)
    {
       v = a[r]; i = l-1; j = r;
       for (;;)
        {
           while (a[++i] < v);
           while (a[--j] >= v);
           if (i >= j) break;
           swap(a,i,j);
        }

        swap(a,i,r);
        quicksort(a,l,i-1);
        quicksort(a,i+1,r);

    }

 }

我可以解释我的理解:第一个如果检查是否l&lt;在这种情况下,因为s大于b。我感到困惑:v被设置为等于[r],这是否意味着S?既然S一直到右边?然后l设置在&#34;数组之外#34;因为它-1。 (所以它是未定义的,我假设)然后j被设置为等于r,但是那个位置r?如在S?

如果a [r] = posision中的字母或其他内容,我有点不明白将什么值设置为什么。希望some1可以解释我第一次交换是如何工作的,所以我希望能够学到这一点吗?

3 个答案:

答案 0 :(得分:1)

最好先了解一下QuickSort算法,然后看看代码是如何与之对应的,而不是研究代码以试图弄清楚QuickSort的工作原理。基本的QuickSort(你拥有的)实际上是一个非常简单的算法。对数组A进行排序:

  1. 如果A的长度小于2,则表示数组已经排序。否则,
  2. 选择A的任何元素作为&#34;枢轴元素&#34;。
  3. 根据需要重新排列其他元素,以使所有小于枢轴的元素位于A的开头,而大于或等于枢轴的元素位于末尾。 (这个特殊版本也将枢轴本身放在两者之间,这是常见的但不是绝对必要的;它可以简单地包含在上部子阵列中,算法仍然有效。)
  4. 将QuickSort过程应用于由(3)生成的两个子阵列中的每一个。
  5. 您的特定代码选择每个(子)数组的最右侧元素作为pivot元素,并且在步骤(4)中,它从子数组中排除枢轴以进行递归排序。

答案 1 :(得分:1)

快速排序的工作原理是将数组分成“左”子阵列,该子阵列仅包含严格小于任意选择的枢轴值的值和仅包含大于或等于枢轴的元素的“右”子阵列。一旦像这样划分了数组,就使用相同的算法对两个子阵列中的每一个进行排序。以下是这适用于您的代码:

v = a[r]将数据透视表值设置为数组中的最后一个元素。这很有效,因为数组可能从未开始排序,因此a[r]与任何值一样好。

while(a[++i] < v) ;一直停在左子阵列的第一个元素上,该元素大于或等于数据透视v。当这个循环结束时,i是一个元素的索引,它应该在右子数组中而不是在左子数组中。

while(a[--j] >= v) ;做同样的事情,除了它停在右子阵列的最后一个元素,它严格小于枢轴v。当这个循环结束时,j是一个元素的索引,它应该在左子数组中,而不是在右子数组中。

每当我们找到一对错误的子数组中的元素时,我们就会交换它们。

当数组中的所有元素都已排序(i符合j)时,我们将数据转换为索引i处的元素(现在保证在右子阵列。)

由于保证枢轴位于正确位置(左子阵列严格较小且右子阵列大于或等于),我们需要对子阵列进行排序,而不是对枢轴进行排序。这就是为什么递归调用使用索引l,i-1i+1,r,将数据透视保留在索引i

答案 2 :(得分:0)

我无法以完全相同的形式提供解决方案。我的想法中的代码过于复杂。

也不确定我提议的是泡泡排序还是修改后的泡泡,但对我来说更容易。我添加的评论是quicksort()调用自身,因此它是递归的。对于像简单的那样简单的东西,我的书不太好。这一切都取决于您对尺寸和效率的需求。如果你要对许多术语进行排序,那么我提议的排序并不是最好的。

for(i = 0; i < (n - 1); i++) {
    for(j = (i + 1); j < n; j++) {
        if(value[i] > value[j]) {
            tmp = value[i];
            value[i] = value[j];
            value[j] = tmp;
        }
    }
}

其中

  • n是总元素数。
  • ijtmp是整数
  • value[]是要排序的整数数组