简体   繁体   中英

My code runs fine when I debug it, but crashes as soon as I run it

I have been asked to built a K sorted array by my professor and then sort it using minheap. A k sorted array is basically an array where each element is at most K positions away from the location it would be if the array was fully sorted in ascending order. For instance, if K=3, the element at position i=8 can be at locations 5, 6, 7, 8, 9, 10, or 11 in the fully sorted arrayI'm stuck in the first part of the problem. Requirements:

  1. Allow the user to enter a number of (N) elements and the number K.

  2. Produce a K-sorted array based on the user input (more than one K-sorted array can be produced; randomly pick one). Display it.

After rigorous thinking I built the below code for K Sorting:

void kSortedArray:: displayKSorted()
{
    cout<<"Please enter the no. of elements you want to KSort: ";
    cin>>N;
    cout<<"Please enter the value for K: ";
    cin>>K;
    int i=0;

    while (i<N)
    {
        cout<<"Enter element "<<i+1<<" : ";
        cin>>arr[i++];

    }
    insertion_sort(arr,N);
    srand(time(NULL));
    int output=0;
    i=0;
    int maxRand=0;
    int minRand=0;
    int arr2[N];
    int a=0;
    int found=0;
    int found1=0;
    int range=0;
    int count1=0;
    vector<int>:: iterator it1;
    vector<int>:: iterator it2;
    vector<int> arr3;
    while(kSortedIndex.size()<N)
    {
        minRand=range-K;
        maxRand=range+K;
        output = minRand + (rand() % (maxRand - minRand + 1));
        if (output<0)
        {
            output=N+output;
        }
        if(output>N-1)
        {
            output=output-N;
        }
        //arr2[i]=output;
        for(it1=kSortedIndex.begin();it1!=kSortedIndex.end();it1++)
        {
            if(*it1==output)
            {
                found=1;
                for(it2=arr3.begin();it2!=arr3.end();it2++)
                {
                    if(*it2==output)
                    {
                        found1=1;
                        break;
                    }
                }

                    if(found1==0)
                    {
                        arr3.push_back(output);
                        count1++;
                    }
                break;

            }
        }

        if(found==0)
        {
            kSortedIndex.push_back(output);
            count1=0;
            arr3.clear();
            range++;
        }
        found=0;
        found1=0;

        if (count1>((2*K)+1))
        {
            range--;
            count1=0;

        }
        if(range>(N-1))
            range--;



    }
    vector<int>::iterator it;
    int j=0;
//    i=0;

    for(it=kSortedIndex.begin();it!=kSortedIndex.end();it++)
    {
        arr2[*it]=arr[j];
        j++;
        //cout<<arr2[j++];
    }

    for(j=0;j<N;j++)
    {
        cout<<arr2[j];
    }

}

Below is the header file:

class kSortedArray
{
    public:
        kSortedArray();
        void displayKSorted();


    protected:

    private:
        int N=0;
        int K=0;
        int* arr=new int [N];
        createKSorted();
        void insertion_sort(int arr[],int length);
        vector <int> kSortedIndex;

};

Could someone please help me to figure out why my code crashes when I run it and runs fine when I debug it. Is it a memory leak issue? I even tried deleting arr, arr2 and clearing arr3 but that isn't working (code still cashes). Your help much appreciated.

The declaration int* arr=new int [N]; in the header is wrong. You cannot allocate memory for the array here because you do not yet know the value for N . That value will be known only after cin>>N; in the kSortedArray:: displayKSorted function. Therefore you need to do allocate memory there:

void kSortedArray:: displayKSorted()
{
    cout<<"Please enter the no. of elements you want to KSort: ";
    cin>>N;

    arr = new int [N];                     // <<< add this line

    cout<<"Please enter the value for K: ";
    cin>>K;
    int i=0;
    ...

Header:

   ...
   private:
        int N=0;
        int K=0;
        int* arr;    // =new int [N];         <<< remove the allocation
        createKSorted();
        void insertion_sort(int arr[],int length);
        ...

Disclaimer: This is non tested non error checking code, and there may be more problems.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM