我有这段代码
class Child{
public:
string code;
float avg;
unsigned int distance;
int month;
bool isSmallerThan(Child child, char *ordering_chars);
};
bool Child::isSmallerThan(Child child, char *ordering_chars) {
for(int i=0; i<3; i++){
if(ordering_chars[i] == 'a'){
if(avg == child.avg)
continue;
return avg < child.avg;
}
else if(ordering_chars[i] == 'd'){
if(distance == child.distance)
continue;
return distance < child.distance;
}
else if(ordering_chars[i] == 'm'){
if(month == child.month)
continue;
return month < child.month;
}
}
return false;
}
void InsertionSort(Child *array, int n, char *ordering_chars){
Child temp;
int i, j;
for(j = 1; j < n; j++)
{
temp = array[j];
for(i = j - 1; (i >= 0) && array[i].isSmallerThan(temp, ordering); i--)
{
array[i+1] = array[i];
}
array[i+1] = temp;
}
}
我有一个Child对象的数组,我想按不同的字段对其进行排序,这取决于从stdin获取的ordering_chars数组。例如,如果ordering_chars是['a','d','m'],则表示如果平均值相等,则按距离排序,如果它也相等,则按月份排序。代码能够工作,但对于大数据而言速度过慢。你有什么解决方法可以使其更加高效吗?我想使用函数指针来解决,但我不确定如何做到这一点。
PS. 我必须使用InsertionSort,不能使用其他方式进行排序,另外我不能使用STL,因为这个代码是用于在线评测的(我不参加任何比赛,只是为了测试自己和学习)。
std::sort
(至少在 MS 实现中)在一个区间包含少于 ~30 个元素时会采用插入排序。 - Evg