c++ 我如何使这个排序算法工作?

rryofs0p  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(185)

我正在尝试一些迭代排序算法,我正在努力使这个算法工作。当我在20个或更少的小列表上使用它时,它实际上是好的,但是当我在200个或更多的元素上使用它时,它给了我一个运行时错误(异常未处理)。我猜这是内存问题,但我真的不知道如何继续。
我想得到的结果是一个函数,它接受一个列表,根据元素是否大于或小于平均值将其分为两部分,然后在两个新创建的列表上再次调用该函数,当它接受一个空列表,只有一个元素,或者已经排序的列表时,它应该什么都不做。
错误:ConsoleApplication4.exe中0x00007FFF05EE5469(ucrtbased.dll)处出现未经处理的异常:0xC00000FD:堆栈溢出(参数:0x0000000000000001、0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

#include <list>
#include <iostream>

void mySort(std::list<int>& input_list) {

    if (input_list.begin() != input_list.end()) {
        
        std::list<int> listaMin;
        std::list<int> listaMaj;
        std::list<int>::iterator it;
        bool alreadySorted = true;
        int previousValue = 0;
        int avg = 0, counter = 0;

        for (it = input_list.begin(); it != input_list.end(); it++) {
            
            if (*it >= previousValue)previousValue = *it;
            else alreadySorted = false;
            avg += *it;
            counter++;
        }
        
        if (alreadySorted == false) {

            for (it = input_list.begin(); it != input_list.end(); it++) {
                
                if (*it < (avg / counter)) { listaMin.push_front(*it); }
                else listaMaj.push_front(*it);
            }

            mySort(listaMin);
            mySort(listaMaj);

            input_list.clear();
            input_list.merge(listaMaj);
            input_list.merge(listaMin);

        }
    }
}

后来:

int main() {

    srand(time(NULL));
    std::list<int> mainList;
    for (int i = 0; i < 100; i++) mainList.push_back(rand() % 100);

    mySort(mainList);

    return 0;
}
oyxsuwqo

oyxsuwqo1#

您的问题是,您在计算用于将列表拆分为2部分的平均值时使用了整数除法。
把元素看作是一个包含3个元素{ 1,2,1 }的列表。这将得到avg = 4counter = 3
然后根据每个元素是<还是>=avg / counter将列表拆分为两个。
在本例中,avg / counter = 4 / 3 = 1(使用整数除法)
由于所有3个元素都〉= 1,因此listaMaj包含所有3个元素,listaMin包含0。
然后,对mysort(listaMaj)的调用导致无限递归,因为同一个列表实际上永远不变地传递。
将您的avg变量定义为double而不是int可以解决这个问题。

相关问题