我用 C 语言实现了一个冒泡排序,并在测试其性能时发现该-O3标志使其运行速度甚至比没有标志时还要慢!与此同时-O2,它的运行速度比预期的要快得多。
没有优化:
time ./sort 30000
./sort 30000 1.82s user 0.00s system 99% cpu 1.816 total
Run Code Online (Sandbox Code Playgroud)
-O2:
time ./sort 30000
./sort 30000 1.00s user 0.00s system 99% cpu 1.005 total
Run Code Online (Sandbox Code Playgroud)
-O3:
time ./sort 30000
./sort 30000 2.01s user 0.00s system 99% cpu 2.007 total
Run Code Online (Sandbox Code Playgroud)
代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
int n;
void bubblesort(int *buf)
{
bool changed = true;
for (int i = n; changed == true; …Run Code Online (Sandbox Code Playgroud) 假设我们有一个问题,某个算法(我们称之为算法_1)的时间复杂度为 ,O(n^2)另一个算法(我们称之为算法_2)的时间复杂度为O(n),但实际上我们看到n < 1000算法_1 更快,否则算法_2 更快是比较快的。
为什么我们不能直接写这样的代码:
if ( n < 1000)
do algorithm_1
else
do algorithm_2
Run Code Online (Sandbox Code Playgroud)
这是程序员真正做的事情还是有缺点?
对于较小的程序,这似乎是一个好主意。
我正在为考试做修改.
想知道在什么条件下插入排序比O(N ^ 2)的相同平均情况复杂度的冒泡排序更好.
我确实找到了一些相关的文章,但我无法理解它们.
有人会介意以简单的方式解释它吗?
我试图理解数据结构和不同的算法,然后我很困惑地测量冒泡排序时间的复杂性.
for (c = 0; c < ( n - 1 ); c++) {
for (d = 0; d < n - c - 1; d++) {
if (array[d] > array[d+1]) /* For descending order use < */
{
swap = array[d];
array[d] = array[d+1];
array[d+1] = swap;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在每个Big O都会告诉Best case O(n),Avg case(n2)和Worst Case(n2).但是当我看到代码时,发现第一阶段内部循环运行n次然后是第二阶段n - 1,n - 2等等.这意味着在每次迭代中它的值都会下降.例如,如果我有[] = {4,2,9,5,3,6,11},那么比较的总数将是 -
1st Phase - 7 time
2nd phase - 6 time
3rd Phase - 5 time
4th …Run Code Online (Sandbox Code Playgroud)