您好,我正在我的大学里做有关数据结构和算法的演讲。我正在做有关分析排序算法的作业。作业需要包含测量算法运行时间的报告。 TA为我们提供了30000个整数的三个数据集。(升序,降序,随机序)
我认为对降序数据进行排序要比对随机排序的数据进行排序要花费更多。但是在我的气泡排序算法中,结果却相反。
对数字进行降序排序需要2.453s实时时间和2.409s用户时间,对数字进行随机排序需要3.217s实时时间和3.159s用户时间。这个结果也与我的选择排序算法有关。降序编号不是最坏的情况吗?
//file is opened at main function
int* bubble_prj4(FILE *fp_in)
{
int i, j, temp;
//arr is declared in header file
arr = (int*)malloc(sizeof(int) * 30000);
fread(arr, sizeof(int), 30000, fp_in);
for(i = 0; i < 29999; i++)
for(j = 29999; j > i; j--)
if(arr[j] < arr[j - 1])
{
temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
return arr;
}
这是我第一次在这里提问。我不知道我的做法正确。
答案 0 :(得分:2)
我运行了您的测试。这是我对三个大小为30,000的不同数据集的结果:
dataset | time (s) | swaps
-----------+------------+----------
random | 3.588447 | 221476595
descending | 2.588694 | 449985000
ascending | 1.582666 | 0
这是怎么回事?为什么随机数据集比“最坏情况”降序数据集慢?
答案似乎是branch prediction。 CPU进行猜测以查看代码中将采用哪个分支,然后执行该分支,并且在下降数据集中100%的时间正确。这样可以显着提高性能,并且more elegantly explained before。
话虽如此,该例程涉及的比较次数相同,并且在所有情况下的时间复杂度均为O(n 2 )。