我正在尝试编写选择排序和插入排序的实现。并使用自动生成的数组对它们进行测试,并使用gettimeofday
下的Pos精度MAC OS
以u秒精度评估耗时。
但在大多数情况下,总65525
且范围从-65525
和+65525
输入数组,插入排序远比选择排序快,大概是一半时间。< / p>
实施见下文:
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;
}
}
一些测试结果:
插入排序:
Min =( - 65524),index =(89660);最大=(62235),指数=(23486) ShowSysTime毫秒:1447749079447950,差异时间到最后记录: 20092583 Min =( - 65524),index =(0); Max =(62235),index =(131050)
选择排序:
Min =( - 65524),index =(89660);最大=(62235),指数=(23486) ShowSysTime毫秒:1447749114384115,差异时间到最后一条记录: 34934768 Min =( - 65524),index =(0); Max =(62235),index =(131050)
插入排序来自本书ITA,所以我怀疑我的选择排序有些不正确。
答案 0 :(得分:2)
Selection sort是一种简单但效率低下的排序算法。它总是具有二次复杂性,在最坏的情况下以及最好的情况下。
另一方面,insertion sort在最坏情况下是二次的,但最好是线性的。因此,在某些情况下,预计它将比选择排序更好。反之亦然。
答案 1 :(得分:1)
在所有选择排序的情况下,将所选值与所有其他未排序的值进行比较。因此,时间复杂度总是二次或n ^ 2.
在插入排序中,在最好的情况下它是线性的(因为,要插入的值总是大于排序部分的最后一个索引处的值)。在最坏的情况下它会变成二次方。