" solution.exe已停止工作"在Eclipse CDT中

时间:2015-07-09 13:32:56

标签: c++ eclipse algorithm eclipse-cdt mergesort

我已尝试在StackOverflow上搜索答案并多次使用Google搜索。我不确定代码到底出了什么问题。当我在Eclipse Luna上运行它时,它只是说" solution.exe已停止工作"。任何人都可以帮我找出这里的错误吗?或者给我一个找出自己的方法?

这是我的代码:

#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

long mergeCountInv(long list[],long tmp[],long left,long mid,long right);
long countInv(long list[],long tmp[],long left,long right);


long mergeCountInv(long list[],long tmp[],long left,long mid,long right) {
    long i = 0,j = mid + 1,k = 0;
    long count = 0;

    while(i < mid && j < right) {
        if(list[i] <= list[j]) {
            tmp[k++] = list[i++];
        }
        else if(list[i] > list[j]) {
            tmp[k++] = list[j++];
            count++;
        }
    }
    while(i < mid) {
            tmp[k++] = list[i++];
        }

    while(j < right) {
            tmp[k++] = list[j++];
        }
    return count;
}

long countInv(long list[],long tmp[],long left,long right) {
    long k = 0,mid;
    if(right == 1) return 0;
    else {
        mid = (left + right)/2;
        k = countInv(list,tmp,left,mid) + countInv(list,tmp,mid + 1,right) + mergeCountInv(list,tmp,left,mid,right);
    }
    return k;
}


int main() {
    long list[100001];
    long i,x=0;

    ///////////////FILE HANDLING////////////////////////////////
    ifstream fin;
    fin.open("IntegerArray.txt");

    while (!fin.eof()) {
        fin >> i;
        list[x] = i;
        x++;
    }

    fin.close();
    ////////////////////////////////////////////////////////////

    long size = sizeof(list)/sizeof(long) - 1;

    long *tmp = new long[size];
    cout<<countInv(list,tmp,0,size);
    delete []tmp;
    return 0;
}

这些是&#34; IntegerArray.txt&#34;的内容:

6
3
5
4
2
1

文件中实际上会有100000个整数,但我先尝试使用较小的测试用例。 非常感谢你的帮助!感谢。

1 个答案:

答案 0 :(得分:0)

如果right大于1,则递归永远不会终止,因为递归的基本情况为right == 1,而您有一个未经修改的right递归调用。

即,countInv(x,y,l,r)调用countInv(x,y,amidpoint,r),调用countInv(x,y,anothermidpoint,r),依此类推,直到您永远陷入countInv(x,y,r-1,r)

究竟如何修复它取决于代码应该做什么,但你很可能想要一个涉及left以及right的基本案例。