为什么选择排序并不贪心

时间:2017-11-11 14:13:08

标签: algorithm brute-force selection-sort

我发现选择排序使用蛮力策略。但是,我认为它使用贪婪策略。

为什么我认为它使用Greedy:它在外部循环从0到n-1,从i + 1到n-1。这真的很天真。它在每次迭代中选择一个最小元素 - 它在本地选择最佳。一切都像贪婪,但事实并非如此。

你能解释一下我为什么不这么想?有关此问题的信息,我在互联网上找不到。

3 个答案:

答案 0 :(得分:2)

设A为一个整数列表,使得:A = [5,4,3,6,1,2,7]

贪婪算法将寻找最有希望的方向,因此:

  1. 我们将比较:5到4,看到4确实小于5,将4设为最小
  2. 比较4到3,将3设为最小值
  3. 现在我们比较3到6,这是一个棘手的部分:在正常选择排序(暴力)中,我们将继续考虑剩余的数字,在贪婪的方法中我们将3作为我们的最小值,并且不会考虑剩下的数字,因此"最好的本地"。
  4. 所以使用这种方法的排序列表将导致列表排序如下:      [3,4,5,1,2,7]

答案 1 :(得分:2)

选择排序确实可以被描述为贪婪算法,在它意义上:

  • 尝试选择优化某个度量的输出(其输入的排列)(“排序”,可以通过各种方式测量,例如inversions的数量),和
  • 通过将任务分解为更小的子问题(用于选择排序,在输出排列中找到 k -th元素)并为每个子问题选择局部最优解决方案来实现。

实际上,相同的描述也可以应用于大多数其他排序算法 - 唯一真正的区别是子问题的选择。例如:

  • 插入排序在本地优化 k 第一个输入元素的排列的排序;
  • 冒泡排序优化了相邻元素对的排序;它需要多次遍历列表以达到全局最优,但这仍然属于贪婪算法的广义定义;
  • merge sort优化输入序列的指数增长子序列的排序;
  • quicksort递归地将其输入划分为任意选择的枢轴两侧的子序列,优化划分以最大化每个阶段的排序。

事实上,在我的头脑中,我无法想到任何实际的排序算法在这个意义上不会贪婪。 (Bogosort不是,但很难被称为实用。)此外,将这些排序算法制定为像这样的贪婪优化问题相当模糊了比较排序算法时实际上重要的细节。

因此,我认为表征选择排序或任何其他排序算法,因为贪婪技术上有效但实际上没用,因为这种分类没有提供真正有用的信息。

答案 2 :(得分:1)

贪婪和蛮力描述了算法的不同特征。

贪婪意味着每一步的算法选择一些本地最佳的选项。也就是说,它没有前瞻。

暴力意味着算法以直接的方式查找选项,并将其全部考虑在内。例如。它可能会通过二分搜索来搜索一个元素,它不再是暴力。

因此算法可能既贪婪又蛮力。这些品质并不是相互排斥的。