当我们需要自定义排序规则时,需要实现一个比较函数,该函数类似如下:
bool cmp(int a,int b)
{
return a>b;
}
当cmp返回true时,a将会排在b前面,因此上面的函数将从大到小排序。
换句话说,cmp函数重新定义了“小”的概念(当a>b时,a“小于”b),整个序列将按照这个“小”的规则从“小”到“大”排序。
前几天同事遇到一个问题:
对一组数据从小到大排序,对于值相等的两个元素,经过排序之后,原本靠后的元素排在前面。于是他写出了如下的比较函数:
bool cmp(int a,int b)
{
return a<=b;
}
以上写法有两个问题:
首先我们回顾下排序算法稳定性的概念:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。
而sort内部使用的排序算法不一定是稳定的(当元素较多时,使用的快速排序是不稳定的),对于一个不稳定的算法,是无法保证值相同的两个元素的顺序的。
从使用上来说,传递给sort的cmp函数,就不应该使用等号。
从后果上来说,上述用法不仅不能解决问题,还可能导致程序coredump——没错,就在周五晚上,运营人员配置了一个新的元素之后,触发