快速排序模板不起作用,并使我的程序无响应
Posted
技术标签:
【中文标题】快速排序模板不起作用,并使我的程序无响应【英文标题】:Quicksort template does not work, and makes my program unresponsive 【发布时间】: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
简化了快速排序算法,包括消除这里所犯的错误。链接的文档甚至有一个使用示例可以做到这一点;实现快速排序。
是否需要在单独的分区功能中添加,或者我可以将它们放在一起吗?
如果您想使用自己的分区算法,当然可以将它们放在一起。
这是某种任务吗?你必须自己实现快速排序吗?
是的,这是一个作业。是的,我确实需要自己实现。
【参考方案1】:
您将递归放入循环中,这不是快速排序的工作方式。并且传递给递归函数的开始和结束位置不正确。
这里是修复。我将参数 size
更改为 end
,因为这就是代码中变量的行为方式。
template <class T>
void sortBDay(vector<T> &birthday, vector<string> &name, vector<T> &birthdate, int startPos, int end) // This template sorts all data by their birthday
if (startPos < end - 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 < end; 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, pivotPos); // do the same for upper and lower pivots
sortBDay(birthday, name, birthdate, pivotPos + 1, end); // recursion
【讨论】:
谢谢!我一定会在我回家后对此进行测试。抱歉回复晚了。 不客气。我才知道这是一个任务。希望大家仔细查看这个快速排序的代码并理解它。 循环里面的代码是把小于pivot的元素放在它前面。然后是两个递归。第一个应该递归从开始到枢轴的范围,第二个应该递归范围枢轴+1到结束。给你一个小测验,我们是否必须将枢轴放在第一次递归中? 是的,在第一次递归中(sortBDay(birthday, name,birthdate, startPos, pivotPos);),枢轴有助于对从 0 到枢轴的所有值进行排序,并对它们进行排序。然后第二个递归对所有值从枢轴开始排序。以上是关于快速排序模板不起作用,并使我的程序无响应的主要内容,如果未能解决你的问题,请参考以下文章