【问题标题】:Understanding Sorting algorithm for C了解 C 的排序算法
【发布时间】: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


【解决方案1】:

首先,你需要知道冒泡排序和选择排序的区别。

  • Selection Sort:通过将所有元素与第一个元素进行比较来完成排序。然后用第二个元素进一步重复,依此类推。

  • Bubble Sort:排序是通过比较数组的两个相邻索引来完成的。

为了计算复杂度,请考虑numInt = 5

现在,从最里面的循环开始考虑:

k = 0+1=1; k<5

此循环将一直持续到 k 计算为 4 并且当 k=5 循环结束并且不进行比较时。因此循环从k=1 执行到k=5,即 5 次 which = intNum 次。

现在考虑这里的外循环:

j = 0; j<4 

这个循环将一直持续到j 计算为3 并且当j=4 循环结束并且不进行比较。因此循环从j=0 执行到j=4,即 5 次 which = intNum 次。

对于嵌套循环,我们将循环的复杂度相乘。因此它评估为

intNum*intNum = intNum^2

O(intNum^2)

请参阅these further details of complexity evaluation

【讨论】:

  • 您对选择排序的定义有点混乱(而且是错误的)。在选择排序中,您将数组分为两部分 - 已排序和未排序,最初都是未排序的。您反复从未排序的部分中选择最小的元素(因此得名)并将其放在已排序部分的末尾。通常,将所有内容与第一个元素进行比较并不是您如何找到最小的元素。
猜你喜欢
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
相关资源
最近更新 更多