【问题标题】:Do you write code to sort a list these days? [closed]这些天您是否编写代码来对列表进行排序? [关闭]
【发布时间】:2010-09-21 00:13:35
【问题描述】:

java/.net 世界中的人们有提供排序列表方法的框架。

在 CS 中,我们可能都经历过 Bubble/Insertion/Merge/Shell 排序算法。 这些天你会写吗?

有了框架,你会编写排序代码吗?

您认为要求人们编写代码以在面试中进行排序有意义吗? (实习生/初级开发人员要求除外)

【问题讨论】:

    标签: sorting


    【解决方案1】:

    为了对数据进行排序,我今天写了两段代码

    list.Sort();
    enumerable.OrderBy(x => x);  // Occasionally a different lambda is used
    

    【讨论】:

    • 并添加:ORDER BY col1, col2
    【解决方案2】:

    我在一家开发工具公司工作,因此有时我需要编写新的 RTL 类型和例程。排序是开发人员需要的东西,所以有时我需要编写它。

    不要忘记,所有这些库代码都不是从某个山上传下来的:必须由某个地方的某个开发人员编写。

    【讨论】:

      【解决方案3】:

      我不编写排序算法,但我已经在 .Net 中为一些类实现了 IComparer,这在前几次很有趣。

      在大多数情况下,考虑到框架中的内容,我不会编写用于排序的代码。应该了解为什么像快速排序这样的特定排序策略经常在 .Net 等框架中使用。

      我可以看到给出或被给出一个排序问题,其中一些工作是实现 IComparer 并了解对类进行排序的不同方法。向某人展示冒泡排序并问:“为什么您不想在大多数应用程序中这样做?”

      【讨论】:

        【解决方案4】:

        我可以 100% 肯定地说,自从离开大学以来,我没有写过任何一种“传统”的排序例程。很高兴知道它背后的理论,但是将它们应用于无法通过其他方式完成的现实情况并不经常发生(至少从我的经验来看......)。

        【讨论】:

          【解决方案5】:

          仅在雇主的面试/测试中 =)

          【讨论】:

            【解决方案6】:

            当我不得不使用自定义键比较对数 GB 的文件进行排序时,我编写了一个合并排序。我喜欢归并排序——它易于理解、稳定,并且在最坏情况下的 O(n log n) 性能。

            我也一直在寻找尝试radix sort 的借口。它不像大多数排序算法那样通用,因此不会有任何库提供它,但在适当的情况下,它应该是一个很好的加速。

            【讨论】:

              【解决方案7】:

              就个人而言,我已经有一段时间不需要编写自己的排序代码了。

              就面试问题而言,它将淘汰那些在CS课上没有注意的人。

              您可以通过询问您将如何构建 Comparable (Capital C) 对象或类似的东西来测试 API 知识。

              【讨论】:

                【解决方案8】:

                在我看来,就像许多其他知识领域一样,编程也有理论和实践的方法。

                “理论编程”领域为我们提供了快速排序、基数排序、Djikstra 算法和许多其他对计算进步绝对必要的东西。

                “实际编程”领域涉及的事实是,在“理论编程”中创建的解决方案应该以更简单的方式被所有人轻松访问,以便理论思想可以得到很多很多创造性的用途。这为我们提供了像 Python 这样的高级语言,并允许几乎任何语言为最基本的操作(如排序或搜索)实现打包方法,并且性能足够好,几乎适合所有人。

                一个人不能没有另一个人... 我们大多数人不需要硬编码排序算法并不意味着没有人应该这样做。

                【讨论】:

                  【解决方案9】:

                  我最近不得不写一些东西。 我有一个文本列表……最常见的十个必须根据它们被选中的频率出现。所有其他条目必须根据 alpha 排序显示。

                  这并不难,但我确实必须写一个排序来支持它。

                  我还必须对那些元素不容易使用开箱即用代码进行排序的对象进行排序。

                  搜索也是如此。我必须遍历一个文件并搜索静态大小的记录。当我找到一条记录时,我必须将一条记录移回,因为我在它之前插入。 在大多数情况下,它非常简单,我勉强粘贴在二进制搜索中。需要进行一些更改以支持访问方法,因为我没有使用实际在内存中的数组.. 啊 c&@p.. 我可以把它当作流来对待.. 看看现在我想去回来看看..

                  【讨论】:

                    【解决方案10】:

                    伙计,如果有人在采访中问我最好的排序算法是什么,当我说“timsort”时没有立即理解,我会认真考虑是否要在那里工作。

                    Timsort

                    这描述了一个自适应的、稳定的、 自然归并排序,俗称 timsort(嘿,我赚到了)。它 在许多方面都有超自然的表现 偏序数组的种类 (少于 lg(N!) 所需的比较, 并且少至 N-1),但速度快 Python 之前高度调优的 随机数组上的 samplesort 混合。

                    简而言之,主程序 穿过阵列一次,离开 对,交替识别 下一次运行,然后将其合并到 以前的“智能”运行。 其他一切都是复杂的 速度,以及一些来之不易的衡量标准 内存效率。

                    http://svn.python.org/projects/python/trunk/Objects/listsort.txt Is timsort general-purpose or Python-specific?

                    【讨论】:

                    • 对于 Python 商店来说这一切都很好,但是还有其他调整和自适应排序使用稍微不同的策略,并且不必使用您熟悉的相同名称。除非你想把自己归类,否则不要太原教旨主义。
                    【解决方案11】:

                    我并没有真正实现过排序,除了作为编码练习和观察一种语言的有趣特性(比如如何在 Python 中对一行进行快速排序)。

                    我认为这是一个在面试中提出的有效问题,因为它反映了开发人员是否考虑过这类事情……我觉得当你调用 list.sort() 时知道它在做什么很重要。作为一名程序员,你应该了解一切背后的基础知识,这只是我理论的一部分。

                    【讨论】:

                      【解决方案12】:

                      我从不写任何有库例程的东西。我已经几十年没有编写过代码了。我也不会。使用直接可用的快速排序和 timsort,没有理由编写排序。

                      我注意到 SQL 会为我进行排序。

                      有很多东西我没有写,只是其中之一。

                      我从不编写自己的 I/O 驱动程序。 (虽然我过去有过。)

                      我从不编写自己的图形库。 (是的,80 年代我也做过一次)

                      我从不编写自己的文件系统。 (避免这种情况。)

                      【讨论】:

                        【解决方案13】:

                        绝对没有理由再编写一个。我认为了解您正在使用的数据的效率很重要,这样您就可以选择最适合您正在排序的数据的数据。

                        【讨论】:

                          【解决方案14】:

                          是的。当您的列表最多只有几十条记录时,有时挖掘 Shell 排序会胜过内置排序例程。

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2020-04-12
                            • 2023-03-30
                            相关资源
                            最近更新 更多