【问题标题】:Sorting algorithm efficiency/performance排序算法效率/性能
【发布时间】:2013-03-17 23:57:14
【问题描述】:

我是编程初学者,只是在玩排序并制作了这个算法。它类似于气泡,但它不是比较相邻的对,而是比较像:第一和第二,第一和第三......第二和第三,第二和第四等等。你能告诉我算法的性能/效率是什么,或者将它与气泡进行比较吗?或者至少建议我如何自己解决问题。我感兴趣的是有多少泡沫比这个更好。谢谢。

void sortArray(int a[]) {

int q, x, temp;

for ( q = 0; q < SIZE - 1; q++ ) {
    for ( x = q + 1; x < SIZE; x++ ) {
        if (a[q] < a[x]) {
            temp = a[q];
            a[q] = a[x];
            a[x] = temp;
        }
    }
}

}

【问题讨论】:

  • 你测试过你的算法了吗?它真的排序吗?
  • 您需要问自己的是:“平均进行了多少次比较”。例如,当从左到右搜索数组中的最大数时,平均检查次数将是列表长度的一半。
  • 听起来有点像selection sort。在外循环的第 n 次迭代中,列表的前 n 个元素处于正确位置。不过,您的交换次数更多。在选择排序中,每次外循环迭代只执行一次交换。

标签: performance algorithm sorting bubble-sort memory-efficient


【解决方案1】:

您的排序类似于经典冒泡排序,并且应该具有基本相同的性能。

您的排序和冒泡排序都可以被视为选择排序的低效版本。对于所有三种算法,内部循环的每次遍历都会遍历数组的未排序区域,找到最小/最大元素,并将其留在最终位置。这些算法并不完全相同,因为它们在未排序区域上执行不同的排列 - 但是,这种差异在功能上对算法的操作没有贡献。

一旦您认识到这一点,就很容易理解为什么选择排序往往比其他两种排序具有常数因子优势:其内部循环的每一次通过都需要最少的交换次数(即,最后一次)。相比之下,冒泡排序和您的排序可能最终会在内部循环的每个迭代中进行多达一次交换...

不过,渐近地说,所有三种排序都将花费 O(N^2) 时间 - 具体来说,内部循环将有 N*(N-1)/2 次迭代。

【讨论】:

【解决方案2】:

简短回答 - 您的算法复杂度为 O(n2) - 就像冒泡排序一样,即两种算法的复杂度基本相同。

【讨论】:

    【解决方案3】:

    @Kevin 在外循环的第 n 次迭代中说前 n 个元素处于正确位置时是正确的。传统的冒泡排序(比较和交换相邻元素)也可以做到这一点,但它的优点是它也对列表中的其他项目进行部分排序,从而增加了在所有迭代完成之前对列表进行排序的机会(当在排序可以完成的外循环迭代期间未检测到交换)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多