【问题标题】:Comparasion Time Complexity of Insertion Sort插入排序的比较时间复杂度
【发布时间】:2013-06-06 23:55:56
【问题描述】:

我在 C(Visual Studio) 和 Java(Eclipse) 中实现了插入排序,以分析完成所需的时间并比较两种语言的差异。

我试图找出算法补全所需的最坏情况时间。(将递减数组转换为递增数组)。

我使用包含 10,000、50,000 和 100,000 个条目的样本运行我的代码,以下是观察结果:

In C:
10000: 0.172 seconds
50000: 3.874 seconds
100000: 15.384 seconds

whereas in Java
10000: 0.048 seconds
50000: 0.385 seconds
100000: 1.924 seconds

我的代码是正常的插入排序代码。里面没有什么新东西。测量的时间仅是插入排序代码,而 i/o 操作与它无关。例如:

Input
Timer starts here
Insertion Sort
Timer ends
Summary(Time required and all)

我相信 C 比 Java 快,但我无法证明这个结果是正确的..

编辑:这是 C 代码

void InsertionSort(int a[]) {
    int i;
    clock_t st, end;
    st = clock();
    for (i = 1; i < MAX; i++)   {
        int temp = a[i];
        int pos = i - 1;
        while(a[pos] > temp)    {
            a[pos + 1] = a[pos];
            pos--;
        }
        a[pos + 1] = temp;
    }
    end = clock();
    printf("\nSorting Completed. Time taken:%f", (double)(end - st) / CLOCKS_PER_SEC);
}

和 Java 代码:

public void Sort(int a[], int size) {
        int i;
        for (i = 1; i < size; i++)  {
            int temp = a[i];
            int pos = i - 1;
            while(pos >= 0 && a[pos] > temp)    {
                a[pos + 1] = a[pos];
                pos--;
            }

            a[pos + 1] = temp;
        }
}

【问题讨论】:

  • 你试过用-O3编译C代码吗?
  • 没错,使用 -O3 标志进行编译,并确保您处于发布模式。
  • 您是否在每种情况下都对相同大小的数据类型进行排序?
  • @Nobilis No 没听说过
  • @bugsbunny 好的,用 -O3 标志编译你的代码并再次比较速度:)

标签: java c algorithm performance-testing


【解决方案1】:

我无法让 jconsole 打印时间,所以我在 Linux 上使用了最粗略的方法来比较时间(我使用了您的插入排序实现)。

C(gcc 被称为gcc -Wall -Wextra -Wunreachable-code -Waggregate-return -Wshadow):

$ gcc -O3 insertion_sort.c 
$ date; ./a.out; date
Tue Jun 11 20:16:24 MYT 2013
Tue Jun 11 20:16:36 MYT 2013

Java:

$ javac Main.java
$ date; java Main; date
Tue Jun 11 20:19:11 MYT 2013
Tue Jun 11 20:19:32 MYT 2013

很明显,C 优于 Java,我使用了一个大小为 150 000 的数组并反向排序。我提供了我的代码的链接:

C

Java

我的建议是设置一个运行 Linux 操作系统的虚拟机并自己尝试(学习一些 Linux 非常有用,更不用说 C 编程轻而易举)。

【讨论】:

  • 是的,我有 VMware,我在 Linux 上试过了。 C 优于 Java。现在我正在尝试 Visual Studio 中的探查器工具。仍在尝试在 VS 中优化代码。谢谢您的帮助。这非常有用。:)
  • 没问题,我很惊讶 VS 会以这种方式编译 C,尽管 -O3 有很大的不同,没有它,我的机器上花了大约 48 秒。
猜你喜欢
  • 2021-05-30
  • 2013-11-18
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2022-11-23
相关资源
最近更新 更多