如何找到第i个最大数量的一组,并订购我最大的数字

时间:2013-02-04 18:27:16

标签: c algorithm sorting selection

来自“Cormen Leiserson Rivest Stein,第3版,问题9-1,C点,第224页”,我有以下任务:

  

给定 n 数字的集合(数组) A ,使用订单统计   算法找到 i-th 最大的数字,围绕那个分区   编号,并对 i 最大数字进行排序。

我使用Randomized-Select算法(来自同一本书,第216页 - 它使用随机分区算法)找到第i个最小数字,而我想找到第i个最大号码(我们称之为“第k个”以避免混淆)。基本上,我可以获得第k个最大的数字:

  

n - ith + 1

然后我调用RandomizedSelect()来找到第k个最大的数字,并且一切都很棒!

这里有一个例子(在C中)我如何找到第4个最大的数字:

int A[10] = {3, 20, 15, 4, 1, 9, 18, 64, 22, 5}; // the given A set
int ith = 4; // I want to find the 4-th largest number of A
int kth = 10 - ith + 1; // I do this "conversion" for the reasons I explained above
int i = RandomizedSelect(A, 0, 9, kth); // it returns the index of A pointing to the 4-th largest number

printf("A vector: ");
for (j = 0; j < 10; j++) printf ("%u ", A[j]); // prints the A vector partially "ordered"

printf("\n4-th largest number: %u", A[i]); // prints the 4-th largest number

这里有一个输出的例子:

  

载体:3 1 4 5 9 15 18 64 22 20

     

第4大数字:18

现在我不仅希望得到第4个最大数字,而且还希望其他4个最大数字S按顺序排列(来自示例:18 20 22 64)。所以我只是在A向量上运行MergeSort(),从之前找到的第i个索引开始直到结束。输出将是:18 20 22 64。

问题在于赋值说我必须围绕第i个(第4个)最大数字进行分区并命令其他i(4)个最大数字,然后运行MergeSort(),如前所述。但是我无法理解为什么要这样做...在我的例子中,18左右的分区意味着什么,因为我尝试过,在我做了那个分区(调用SelectedPartition())后,这就是A向量的输出: / p>

  

3 1 4 5 9 15 18 64 22 20

     

18

......这是相同的输出!

那么,我对作业的误解是什么?或者,我是以更好的方式做到的吗?

1 个答案:

答案 0 :(得分:2)

计算订单统计有许多不同的算法。许多像quickselect或median中位数算法一样,在第k个元素周围自动对数组进行分区,作为其实现的一部分。但是,无法保证选择算法必须这样做。例如,您可以通过将所有元素放入订单统计树数据结构,然后查询第k个元素来实现选择。因此,最好放入显式分区步骤以确保分区发生。

在您的情况下,由于您使用的是已经执行分区的算法,因此您可以放心地忽略此步骤。

希望这有帮助!