【问题标题】:sort big amount of records by date [closed]按日期对大量记录进行排序[关闭]
【发布时间】:2011-08-28 08:18:00
【问题描述】:

我有 10700 条记录,我需要尽快对它们进行排序 我一直在阅读有关排序算法类型的文章,但迷路了,我不知道什么是最好的选择:http://en.wikipedia.org/wiki/Sorting_algorithm

编辑 1: 我需要写一段代码来计算执行算法的时间

EDIT 1-2 : 是否有任何语言具有排序和计算排序时间的功能?

还有一个问题是用于实现算法的语言会影响速度吗? (例如,如果我使用 c++,它会比 java 或 .Net lang 更快吗???)

注意这不是家庭作业。

【问题讨论】:

  • 我没有投反对票,但您询问“需要多少秒”,这在很大程度上取决于硬件,但没有提供任何相关信息。另外,如果你这样做了,没有人会为你做这个基准,你应该自己做基准。
  • 您的问题无法真正回答。最佳选择取决于很多因素,包括您最熟悉的环境/语言,以及您想要优化的因素(仅时间、内存、平衡两者?担心数据偏差会影响时间?)它会更快吗”取决于它的编码方式。顺便说一句,10k 条记录相当小,可能太小而无法在现代平台上的合理算法之间产生明显差异。
  • @Mat amen to that - 一个算法选择标准有时会在过程中(太晚)弹出,即排序是否稳定,最好从一开始就考虑这一点。跨度>
  • 好的,作为 nLog(n) 中的快速排序正常情况,速度(复杂性)因素的最佳选择是什么,以及如何计算独立于硬件的算法的执行时间?

标签: performance algorithm sorting programming-languages date-sorting


【解决方案1】:

除非这是一个家庭作业问题,否则不要实现自己的排序算法。

使用您的开发环境已经提供的那个 - 它会比您自己编写的任何东西都强大、经过调试并且几乎可以肯定更快。

FWIW,.NET 中 List<T> 上的 Sort() 方法使用快速排序。

实际环境(C++ vs .NET vs Java)的影响可以忽略不计,除非您在极少的内存中执行此操作。使用任何你有经验的东西。

【讨论】:

  • 好的,我需要如何计算执行时间?
  • @xsari 如您阅读的维基百科页面上所述,许多排序算法的执行时间是可变的,具体取决于输入数据集的顺序。使用预期的数据量和各种随机情况和特殊情况(预排序、倒排等)进行测试运行,应该可以很好地了解所选排序算法对输入进行排序需要多长时间。
  • 测量经过的执行时间,请使用 .NET 中的 StopWatch 类。提前计算执行时间几乎是不可能的——即使您可以预测所需的 CPU 周期数,您也需要考虑机器上运行的所有其他程序并(提前)预测其中哪些会对 CPU 周期的要求。
【解决方案2】:

这段 Java 代码展示了如何确定至少一些你所追求的数字:

public class Main {

    private static long test (double[] tosort) {
        Date begin = new Date();
        Arrays.sort(tosort);
        Date end = new Date();
        return end.getTime() - begin.getTime();
    }

    public static void main(String[] args) {
        double[] tosort = new double[10700];

        for (int jj=0;jj<10;jj++) {
            for (int ii=0;ii<tosort.length;ii++) {
                tosort[ii] = Math.random();
            }
            System.out.println("Random data " + test(tosort));
        }

        for (int jj=0;jj<10;jj++) {
            for (int ii=0;ii<tosort.length;ii++) {
                tosort[ii] = ii;
            }
            System.out.println("Presorted data " + test(tosort));
        }

        for (int jj=0;jj<10;jj++) {
            for (int ii=0;ii<tosort.length;ii++) {
                tosort[ii] = tosort.length - ii;
            }
            System.out.println("Inverted data " + test(tosort));
        }

    }

}

仅供参考,只有我的计算机每次运行执行的代码在排序例程中花费的时间保持在 1 毫秒以下,我必须将数据大小增加 100 倍才能获得一些有意义的数据。

  • 这段代码完全抽象了比较器代码所需的时间(元素是原始双精度,比较其他对象可能需要更多时间)
  • 一旦即时编译器找出代码,它也应该会变得更快
  • 您可以使用其他排序算法轻松添加测试运行,并查看它们的行为方式

这些数字在硬件功能、输入数据类型、计算机负载等方面会有所不同,但您至少可以对预期有所了解。

【讨论】:

    【解决方案3】:

    您不需要实施任何算法(除非这是家庭作业)。每种语言都有其排序功能,而且它们非常高效。例如,在 C++ 中,您将使用 std::sort,它在许多实现中使用快速排序(如果元素数量较少,则使用插入排序)。

    【讨论】:

    • 在大多数现代实现中,我希望 std::sort 被实现为 Introsort;这通常像快速排序一样,但如果递归太深,它会切换到堆排序。
    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 2020-05-26
    • 2021-08-05
    • 2020-10-30
    相关资源
    最近更新 更多