算法:分而治之(快速排序的应用?!)

时间:2015-02-08 18:11:06

标签: algorithm quicksort divide-and-conquer partial-sort

有关如何处理以下问题的任何帮助将不胜感激。我也对这个问题发表了一些看法。

  

您是一个招收n名学生的班级的助教。你有   他们的最终得分(未分类),你必须给他们一个G   可用等级(A,B,C等)。约束是(假设n是a   G的倍数:

     
      
  • 完全(n / G)学生获得每个年级(for   例如,如果n = 30,而G = {A,B,C},则恰好有10名学生获得A,   10得到B,10得到C)
  •   
  • 得分较低的学生不会得到   比成绩较高的学生成绩更高(但是,他们可能会得到   同一年级)假设每个学生得到不同的分数,   推导出一种有效的算法,并在n方面给出其复杂性   和G.任何首先对分数进行排序的算法都将收到零   信用。
  •   

我的回答: 好吧,问题的最后一行说如果我首先尝试对数组进行排序并将数组分成G个相等的部分,那就不好了。当使用最佳排序算法时,这将花费O(n log n)。所以,我想到了一个错综复杂的解决方案。我认为这个问题是快速排序可以派上用场的一个例子,因为我们不需要对属于同一等级的学生进行排序,我们可以拥有k个关键元素,而关键元素都是等间距的。 但是,我们没有得到学生的分数,我们也被告知每个学生都有不同的分数。

首先,我使用MaxMin Divide and Conquer算法计算最大和最小分数,这将花费O(n)时间。使用最大值和最小值,我们可以通过计算粗略地找到每个等级的关键元素。 (最大 - 最小)/ k =最低等级,2 *(最大 - 最小)/ k =第二最低等级。和k-1 *(最大 - 最小)/ k =最高等级。

现在使用这些作为关键元素我们只能执行快速排序的分区方法,第一次需要n次,第二次是n-(Max-Min)/ k,依此类推。因此,算法的时间复杂度为O(n),因为min-max问题具有复杂度O(n),而快速排序中的分区具有O(n)的复杂性。

请分享您的想法。

2 个答案:

答案 0 :(得分:1)

您可以将所有分数放在(最大)优先级队列中,然后从中提取n / G组。这仍然是一种隐含的排序,但是规则并未被禁止。

答案 1 :(得分:1)

这基本上是一个选择问题,只是你一次做G选择。

http://en.wikipedia.org/wiki/Quickselect算法的修改应该适用于此处。虽然Quicksort总是以递归方式下降到两个分区中,而原始的Quickselect只下降到包含第k个索引的分区,但当且仅当它包含n/G {{1}之一时,此问题的算法应该下降到分区中。 },... 2*n/G数组索引 - 在分数之间分割点的索引。

这些索引是成绩之间的分裂点,因此您最终会得到一个数组,其中分割点之间的元素不一定要排序,但这些点之间的块是。