【发布时间】:2016-03-21 04:06:22
【问题描述】:
我正在尝试对生日向量进行排序(使用我的快速排序实现),并根据它们的变化方式更改包含名称和生日的两个向量的顺序。我关注了有关如何实现快速排序的在线资源,但我不确定为什么它不起作用。这是我的代码:
template <class T>
void sortBDay(vector<T> &birthday, vector<string> &name, vector<T> &birthdate, int startPos, int size) { // This template sorts all data by their birthday
if (startPos < size - 1) { // if the first value is less than the last value
T pivotVal = birthday[startPos]; // the pivot value is the vector's first value
int pivotPos = startPos; // the pivot position is the vector's starting position
for (int pos = startPos + 1; pos <= size; pos++) { // repeat for all values of vector
if (birthday[pos] < pivotVal) { // if the current position is less than the starting position
swap(birthday[pivotPos + 1], birthday[pos]);
swap(birthday[pivotPos], birthday[pivotPos + 1]); // switch the positions
swap(name[pivotPos + 1], name[pos]); // and their names
swap(name[pivotPos], name[pivotPos + 1]);
swap(birthdate[pivotPos + 1], birthdate[pos]); // and their birthdates
swap(birthdate[pivotPos], birthdate[pivotPos + 1]);
pivotPos++; // then go onto the next one
}
sortBDay(birthday, name, birthdate, startPos, size - 1); // do the same for upper and lower pivots
sortBDay(birthday, name, birthdate, startPos, size + 1); // recursion
}
}
}
我不知道这个实现有什么问题。任何帮助,将不胜感激!提前致谢。
【问题讨论】:
-
pos <= size- 这看起来一点都不好。如果所有这些数据都在一个对象向量中而不是三个不同的向量中,这将变得更加清晰。然后,std::partition简化了快速排序算法,包括消除这里所犯的错误。链接的文档甚至有一个使用示例可以做到这一点;实现快速排序。 -
是否需要在单独的分区功能中添加,或者我可以将它们放在一起吗?
-
如果您想使用自己的分区算法,当然可以将它们放在一起。
-
这是某种任务吗?你必须自己实现快速排序吗?
-
是的,这是一个作业。是的,我确实需要自己实现。