我正在尝试一些迭代排序算法,我正在努力使这个算法工作。当我在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;
}
1条答案
按热度按时间oyxsuwqo1#
您的问题是,您在计算用于将列表拆分为2部分的平均值时使用了整数除法。
把元素看作是一个包含3个元素{ 1,2,1 }的列表。这将得到
avg = 4
和counter = 3
。然后根据每个元素是
<
还是>=
avg / counter
将列表拆分为两个。在本例中,
avg / counter = 4 / 3 = 1
(使用整数除法)由于所有3个元素都〉= 1,因此
listaMaj
包含所有3个元素,listaMin
包含0。然后,对
mysort(listaMaj)
的调用导致无限递归,因为同一个列表实际上永远不变地传递。将您的
avg
变量定义为double
而不是int
可以解决这个问题。