任何人都可以解释这个peudo代码(分区)

时间:2015-12-09 13:07:02

标签: algorithm sorting pseudocode

1.有人可以解释并阅读此代码吗?这是搜索第K个关键伪代码,看起来并不困难,但我很难理解这些代码行。特别是,我想让你分享你在partition()中的接近方式,我理解隐居功能是有效的,所以你不必解释选择功能,但如果你愿意,你可以这样做..(这是我的第一个问题如果我的问题含糊不清,请告诉我。)

 keytype selection(index low, index high, index k) {
     index pivotpoint;
     if(low == high)
       return s[low];
     else {
         partition(low, high, pivotpoint);
         if (k == pivotpoint)
           return s[pivotpoint];
         else if (k < pivotpoint)
           return selection(low, pivotpoint-1, k);
         else 
           return selection(pivotpoint+1, high, k-pivotpoint);
         }
   }    

 void partition(index low, index high, index& pivotpoint) { 
     index i,j;
     keytype pivotitem;
     pivotitem = s[low];
     j=low;
     for (i = low+1; i <= high; i++)
      if(s[i] < pivotitem) {
       j++;
       exchange s[i] and s[j];
      }
     pivotpoint = j;
     exchange s[low] and s[pivotpoint];
    }

2 个答案:

答案 0 :(得分:0)

这是Quickselect算法。

partition的想法是在slow之间对数组high中的元素进行分区,如下所示:

  • 首先选择pivotitem,在这种情况下是s[low]
  • 循环遍历s(从i=low+1开始)并将所有小于pivotitem的元素移动到数组的左侧部分(也从j=low+1开始)
  • 当循环终止时,s[low+1,...,j]都小于pivotitem,而s[j+1,...,high]都大于或等于pivotitem
  • 最后两行将pivotpoint指向j,并将pivotitem移至该位置。

总结一下,当函数终止时,变量pivotpoint指向lowhigh之间的位置, {{1}之间的所有元素}和low小于pivotpoint-1s[pivotpoint]pivotpoint+1之间的所有元素都大于或等于high

答案 1 :(得分:0)

首先,您要选择一个枢轴元素。分割后,小于枢轴元素的所有元素将位于枢轴的左侧,并且大于枢轴的所有元素将位于右侧。您可以选择任何元素作为枢轴元素。 选择了枢轴元素后,首先要为枢轴元素指定一个初始位置,该位置在您的情况下较低。然后我们遍历所有元素,看看它们是否小于或大于枢轴元素。现在有两个案例出现了:

  1. 当a [i]&gt; pivot:As(i&gt; j)始终为true,数组元素已位于pivot元素的右侧。
  2. 当a [i]&lt; pivot:在这种情况下,数组元素位于pivot的右侧,小于pivot。所以,我们应该将它转移到枢轴的左侧。因此,我们将枢轴元素的位置增加1,并将较小的元素移动到枢轴位置,将较大的元素移动到右侧。 在迭代之后,我们将pivot元素的值推到它的位置。
  3. 有关详细信息,请参阅quick sort