快速排序模板不起作用,并使我的程序无响应

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 &lt;= 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 到枢轴的所有值进行排序,并对它们进行排序。然后第二个递归对所有值从枢轴开始排序。

以上是关于快速排序模板不起作用,并使我的程序无响应的主要内容,如果未能解决你的问题,请参考以下文章

HTML & CSS:排序表按钮不起作用

响应式设计 - 媒体查询在 iPhone 上不起作用?

分区在我的快速排序功能中不起作用

Vue js:Vuetify 服务器端数据表搜索过滤器不起作用

插入排序的快速排序代码不起作用

依赖键路径的KVO对Swift类不起作用