从“Cormen Leiserson Rivest Stein,第 3 版,问题 9-1,C 点,第 224 页”中,我有以下作业:
给定一个包含n 个数字的集合(数组)A,使用排序统计算法找到第i 个最大的数字,围绕该数字进行分区,并对最大的i个数字进行排序。
我使用了随机选择算法(来自同一本书,第 216 页 - 它使用随机分区算法)找到第 i 个最小的数字,而我想找到第 i 个最大的数字(我们称之为“ k-th”以避免混淆)。基本上,我可以获得第 k 个最大的数字:
n - i + 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 向量的输出:
3 1 4 5 9 15 18 64 22 20
18
......这是相同的输出!
那么,我对作业有什么误解?或者,我做得更好吗?