何时实现自己的排序算法?

本文关键字:算法 排序 自己的 实现 何时 | 更新日期: 2023-09-27 17:53:44

如果这是一个愚蠢的问题请原谅....但我回想起我的《计算机科学》。我清楚地记得,我在课堂上学习或被问及几种排序算法和相应的"大O"符号。

在课堂之外,我从来没有真正写过排序的代码。

当我从数据库中获得结果时,我使用'Order By'。否则,我将使用实现排序的集合类。我实现IComparable允许排序;但我从来没有超越过。

对于我们这些不实现语言/框架的人来说,排序一直只是一个学术追求吗?或者仅仅是在现代硬件上运行的现代语言使它成为一个微不足道的细节?

最后,例如,当我在List(Of String)上调用。sort时,底层使用的是什么排序算法?

何时实现自己的排序算法?

虽然您可能很少需要自己实现排序算法,但了解不同的算法及其复杂性可能有助于您解决更复杂的问题。

最后,例如,当我在List(Of String)上调用。sort时,底层使用的是什么排序算法?

快速排序

自从我在大学上了计算机科学课程后,我就再也没有实现过自己的排序算法,如果我打算自己编写排序算法,我最好先检查一下我的大脑。

List<T>根据MSDN文档使用快速排序:

http://msdn.microsoft.com/en-us/library/b0zbh7b6.aspx

如果你使用高级语言,你可能不会实现你自己的排序算法…

你在课堂上学到的仅仅是教你大0符号的存在和重要性。

它的存在是为了让你知道优化永远是编程的目标,当你编写代码时,你必须始终考虑它将如何执行。

它告诉你,循环中的循环和递归如果在编码开始之前没有分析/优化好,可能会导致很大的性能问题。

这是一个指导,检查你的设计之前,能够近似的执行速度。

了解这些算法的工作原理对程序员来说是很重要的。一个原因可能是,在某些条件下,某些算法更好,尽管排序很少是瓶颈。

在某些框架中,. sort函数根据具体情况使用各种方法。

  1. 在现代硬件上运行的现代语言使它成为一个微不足道的细节,除非一个分析器显示排序是你代码的瓶颈。
  2. 据此,列表。Sort使用Array。Sort,使用快速排序。

在我看来,这已经变成了一种学术练习。您需要了解算法的复杂性,排序就是一个很好的例子,因为您可以很容易地看到结果并计算不同的复杂性。然而,在现实生活中,几乎可以肯定的是,有一个库调用可以更快地对你的范围进行排序,而不是你自己进行排序。

我不知道。net库的默认实现是什么,但我猜是Quicksort或Shellsort。我很想知道是不是别的原因。

我偶尔不得不编写自己的排序方法,但只有在为相对不成熟和功能不足的平台(如Windows CE中的。net 1.1或嵌入式java或诸如此类的平台)编写时。

在任何类似现代计算机的东西上,最好的排序算法是T-SQL中的ORDER BY子句。

实现你自己的排序是一种你做的事情,你可以深入了解算法是如何工作的,权衡是什么,哪些行之有效的方法可以有效地解决一系列问题,等等。

正如Darin Dimitrov的回答所述,库排序例程需要具有非常有竞争力的平均情况性能,因此通常选择快速排序。

对于我们这些不实现语言/框架的人来说,排序一直只是一个学术追求吗?或者仅仅是在现代硬件上运行的现代语言使它成为一个微不足道的细节?

即使你没有实现自己的例程,你也可能知道你的数据可能是如何排列的,并且可能想要选择一个合适的库算法。例如,请参阅关于近排序数据的讨论。

我认为有时候需要使用自定义排序方法。如果您想按汽车的型号排序,而不是按字母顺序排序,该怎么办?例如,您有一个包含品牌的数据库:本田、雷克萨斯、丰田、讴歌、日产、英菲尼迪

如果使用普通排序,得到的顺序是:Acura, Ford, Honda, Hyundai, Lexus, Toyota

如果您想根据汽车公司的标准和豪华级别对它们进行排序,该怎么办?雷克萨斯、丰田、本田、讴歌、日产、英菲尼迪

我认为你需要一个自定义排序方法,如果是这样的话。