准确的选择排序算法
如果要对一个数列进行完全的排序,那么用sort是个不错的选择.
但是如果只是部分排序, 要考虑更高效的算法.
比如你只需要选出最好的前N个,并且需要对这N个排序, 此时用的语句如下std::partial_sort(intVecA.begin(), intVecA.begin() + 5, intVecA.end());
对partial_sort的第四个入参如果没有指定,默认用的less, 从小到大排列
而且要注意对于partial_sort的区域指定[first, middle) 区域
遵循的是左闭,右开原则,所以如果要把前5个元素放到[0,4]区间上,在partial_sort的入参中要写成std::partial_sort(intVecA.begin(), intVecA.begin() + 5, intVecA.end());
但是如果你只需要选出最好的前N个, 但不需要对这N个排序,这时候最佳的选择是nth_element() 函数. std::nth_element(intVecA.begin(), intVecA.begin() + 4, intVecA.end());
同样是前5个,注意这里入参和partial_sort的区别.这里的入参是intVecA.begin() + 4
, 原因是对于nth_element, 第二个入参的含义是"参数设置为 intVecA.begin() + 4,即指向的是 myvector 容器中第 5 个元素所在的位置。因此,nth_element() 函数会查找“第 5 小”的元素,并将其移动到 第5个位置(也就是位置4,位置从0计数),同时使 5th 之前的所有元素都比第5元素小(默认),使 5th 之后的所有元素都比 第5元素大"
分类算法
在一个序列中,如果要把满足某条件的放在前面,不满足条件的放在后面,同时得到分解点的迭代器. 这种需求使用partition(intVec.begin(), intVec.end(), isValLargerThan10);
该语句会把大于10的序列数据放在intVec容器的前端. 小于等于10的元素放在intVec容器的后端. partition返回的是第一个不满足条件的元素对应的迭代器.
稳定排序,和非稳定排序算法的区别
对于稳定排序,如果排序前A元素和B元素值相同, 且A排在B之前,那么稳定排序后可以保证A始终在B之前,尽管他们的值是相同的.
但非稳定排序做不到. partical_sort, sort, nth_element都是非稳定排序. stable_sort是稳定排序算法.
网友评论