【问题标题】:Why my selection sort is slower than insertion sort为什么我的选择排序比插入排序慢
【发布时间】:2016-02-18 13:22:04
【问题描述】:

我正在尝试编写选择排序和插入排序的实现。并使用自动生成的数组对它们进行测试,并使用 Posix gettimeofday 以 u 秒精度评估耗时,低于 MAC OS

但在大多数情况下,总共有65525 和范围从-65525+65525 输入数组,插入排序比选择排序快得多,大约一半时间。

实现见下文:

void selectionSort (vector<int>& ns) {
uint_t j, minInd; 
for (uint_t i = 0; i< ns.size() - 1; i++) {
    j = i + 1;         
    minInd = i;
    while (j < ns.size()) {
        if(ns[j] < ns[minInd])
           minInd = j; 
        j++;
    }
    if (minInd != i) {
        int tmp = ns[minInd];
        ns[minInd] = ns[i];
        ns[i] = tmp;
    }
    }
} 

insertSort (vector<int>& ns){
       for(int i = 1; i < (int)ns.size(); i++) {
       int key = ns[i]; 
       int j = i - 1;
       for( ; j >= 0; j--) {
           if (ns[j] > key ) {
               ns[j+1] = ns[j]; 
           } else {
               break;
           }
       }
       ns[j+1] = key;
    }
}

一些测试结果:

插入排序:

最小值=(-65524),索引=(89660);最大值=(62235),索引=(23486) ShowSysTime 毫秒:1447749079447950,上一条记录的差异时间:20092583 最小值=(-65524),索引=(0);最大值=(62235),索引=(131050)

选择排序:

最小值=(-65524),索引=(89660);最大值=(62235),索引=(23486) ShowSysTime 毫秒:1447749114384115,上一条​​记录的差异时间:34934768 最小值=(-65524),索引=(0);最大值=(62235),索引=(131050)

插入排序来自书 ITA,所以我怀疑我的选择排序有什么不正确的地方。

【问题讨论】:

  • 根据定义,选择排序几乎比插入排序慢,所以这并不令人意外,表明有问题,但在意料之中。
  • @harold 。就连我也是来写这个的。你打败了我:P

标签: algorithm sorting insertion-sort selection-sort


【解决方案1】:

Selection sort 是一种简单但低效的排序算法。无论在最坏情况下还是在最好情况下,它总是具有二次复杂度。

另一方面,insertion sort 在最坏的情况下是二次的,但在最好的情况下是线性的。因此,预计在某些情况下,它会比选择排序执行得更好。相反会令人惊讶。

【讨论】:

  • 注意:不要忘记 Ω(n)
【解决方案2】:

在选择排序的所有情况下,将选定的值与所有其他未排序的值进行比较。因此,时间复杂度总是二次或 n^2。

在插入排序中,在最好的情况下它是线性的(因为,要插入的值总是大于排序部分的最后一个索引处的值)。在最坏的情况下它会变成二次方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2014-10-26
    • 1970-01-01
    • 2014-05-17
    • 2021-06-19
    • 1970-01-01
    • 2016-02-01
    相关资源
    最近更新 更多