【发布时间】:2016-04-13 23:49:03
【问题描述】:
我正在为周五的 GNU C 测试而学习。在评论中有一个我无法理解的问题。 “以下算法将数组按升序排序。该算法对被排序内容的顺序(随机、排序顺序、反向排序)敏感。根据比较的确切数量和最小和最大运行时性能所需的交换。当 N 接近 ∞ 时,它的整体性能在大“O”表示法中是什么。你必须分析地支持你的答案才能获得学分。在算法输入中具有相同值的密钥如何排序完成后出现?”
//Sort Grades in ascending order by locating grade[0], then grade[1], etc.
void AscendingSort( int intArray[ ], int numInt){
for(int j = 0; j < numInt - 1; j++ ){
for(int k = j + 1; k < numInt; k++ ){
if( grades[ j ] > grades[ k ] ){
int temp = grades[ j ];
grades[ j ] = grades[ k ];
grades[ k ] = temp;
}
}
}
}
所以我相信这是一个冒泡排序,对于排序顺序的最佳情况,复杂性将是 O(N)。对于更坏的情况,这是相反的顺序,对于随机顺序,它将是 O(N^2)。那么我该如何准确计算呢?我如何从给定的信息中实际计算比较和交换的数量?此外,如果您可以了解将不胜感激的排序算法,我很难理解这一点。 :(提前谢谢!!
【问题讨论】:
-
这不是冒泡排序,而是选择排序。
-
"if you can walk through the sort algorithm" - 用铅笔和纸用一个短数组模拟代码的执行(5-6个元素应该足够了) .这是了解其工作原理的最佳方式。
-
关于 O(N) 和冒泡排序的说明。为了让冒泡排序在 O(N) 时间内完成,它需要有提前终止代码。换句话说,如果冒泡排序检测到在特定通过数组时不需要交换,那么它会立即退出两个循环。由于您问题中的代码无法提前退出循环,因此它将始终在 O(N^2) 时间内运行。当然,正如@MikeCAT 所说,显示的代码实际上并不是冒泡排序。
-
@MikeCAT 你怎么知道它是选择排序,因为对我来说它看起来像冒泡排序。我也把它写在纸上,但我在经历临时工时感到困惑。除此之外,这只是我问题的一半,您如何根据给出的信息计算比较和交换?从给出的算法中,你如何找到最好的、最坏的和平均的情况?
-
这是selection sort,因为每个元素都与处理范围内的第一个元素进行比较,并提取范围内的最小元素。在bubble sort 中只会比较相邻的元素。
标签: c arrays algorithm sorting