Merge和QuickSort - 堆栈重载

时间:2014-01-12 10:23:34

标签: c++ sorting stack quicksort mergesort

Helo everyone。 :) 我必须编写一个程序,我有4种类型的排序:bubble-,inserted-,merge-我快速排序。 程序必须按照它们的坐标总数(随机)对点x,y进行排序//e.g.:(1,3)小于(0,6),因为1 + 3 <0 + 6 //。它将已排序的数据保存在同一个数组中,也保存在txt文件中,并按每个B,I,M,Q排序进行排序。

Merge和MergeSort的代码:

void Merge(Structure *tab, int A, int sr, int Z)
{   
    Structure *tmp = new Structure[Z];
    int i;
    for (i = A; i <= Z; ++i)
    {
        tmp[i] = tab[i];
    }
    i = A;
    int j = sr + 1;
    int q = A;
    while (i <= sr && j <= Z)
    {
        if (Compare(tab, i, j)) //'Compare' tells if total of coordinates from tab[i] is bigger than total from tab[j]
        {
            tab[q] = tmp[i];
            ++j;
        }
        else
        {
            tab[q] = tmp[j];
            ++i;
        }
        ++q;
    }
    if(i <= sr)
    {
        while (i <= sr)
        {
            tab[q] = tmp[i];
            ++i;
            ++q;
        }
    }
    else
    {
        while(j <= Z)
        {
            tab[q] = tmp[j];
            ++j;
            ++q;
        }
    }

    delete[] tmp; 
}

void MergeSort(Structure *tab, int A, int Z)
{
    int sr = (A + Z)/2;
    if(A < Z)
    {
        MergeSort(tab, A, sr);
        MergeSort(tab, sr + 1, Z);
        Merge(tab, A, sr, Z);
    }
}

到QuickSort:

int DivideQS(Structure *tab, int A, int Z)
{
    Structure tmp;
    Structure pivot = tab[A]; // first el. for pivot (A=0)
    int i = A, j = Z; //indexes in array
    while (true)
    {
        while (Compare(tab, j, A))
        j--;
        while (!Compare(tab, i, A)) // until elements are lower than pivot,       that's this '!' for
        i++;
        if (i < j) // swap when i < j
        {
            tmp = tab[i];
            tab[i] = tab[j];
            tab[j] = tmp;
            i++;
            j--;
        }
        else
        return j;
    }
}
void QuickSort(Structure *tab, int A, int Z)
{
    int dziel;
    if (A < Z)
    {  
        dziel = DivideQS(tab, A, Z);
        QuickSort(tab, A, dziel);
        QuickSort(tab, dziel+1, Z);
    }
}

我的问题是堆栈。无论我做多大,它仍然会超载。我无法解决这个问题。我不知道这是因为代码中的错误还是其他地方的错误。泡泡和插入工作无可挑剔。 我在寻找许多网站上的解决方案,我的语言和外国人(我是极点),并在很多方面修改代码,但仍然不知道该怎么做。 请帮帮我。

===================================

我怎么会这么盲目!谢谢@ user3187084。 :d 但我想我情况越来越糟。现在我收到了新的错误消息:

  

Windows在Projekt_AiSD.exe中触发了断点。   这可能是由于堆的损坏,这表明Projekt_AiSD.exe或其加载的任何&gt;中的错误。   这也可能是由于用户在Projekt_AiSD.exe具有焦点时按下F12。   输出窗口可能包含更多诊断信息。

之后,这向我显示:http://i40.tinypic.com/314qyl5.png

这是用于检查的代码:

#include <ctime>
#include <cstdlib>
#include <cstdio>
#include <Windows.h>
#include <string>
#include <fstream>
#include <sstream>
using namespace std;

struct Structure
{
int x;
int y;
};
bool Compare(Structure *tab, int i, int j)
{
    if ( (tab[i].x + tab[i].y) > (tab[j].x + tab[j].y))
        return true;
    return false;
}
void LosujWspolrzedne(Structure* tab, int K)
{
    srand(time(NULL));
    for (int i = 0; i < K; i++) 
    {
        tab[i].x = rand()%21;
        tab[i].y = rand()%21;
    }
    //return;
}
void Save (Structure *tab, int K, string NazwaPliku)
{
    ofstream zap(NazwaPliku); 
    for (int i = 0; i < K; i++)
    {
        zap << tab[i].x << ' ' << tab[i].y << endl;

    }
    zap.close();
}
void Load (Structure *tab, int K, string NazwaPliku)
{
    ifstream wcz(NazwaPliku);
    if (!wcz)
    {
        cout << "Can't open the file!!!" << endl;
        exit(1);
    }
    for (int i = 0; i < K; ++i)
    {
        wcz >> tab[i].x >> tab[i].y;
    }
    wcz.close();
}
void Time(long long a, long long b, string NazwaPliku)
{
    ofstream czas(NazwaPliku);
    if (!czas)
    {
        cout << "Can't open the file!!!" << endl;
    }
    czas << (b - a) << " ms" << endl;
    czas.close();
}
void CopyArray(Structure *tab, Structure *tab1, int K)  
{
    for (int i = 0 ; i < K ; i++) 
    {
        tab1[i].x = tab[i].x;
        tab1[i].y = tab[i].y;
    }
}
void Call_MS(Structure *tab, int A, int K)
{
    Load(tab, K, "1k.txt");
    long long startTime = GetTickCount64();
    MergeSort(tab, A, K-1);
    long long endTime = GetTickCount64();
    cout << (endTime - startTime) << "ms dla MergeSort" << endl;
    Save(tab, K, "WartLos_MS_1k.txt");
    Time(startTime, endTime, "WartLos_MS_1k_czas.txt");
}
void Call_QS(Structure *tab, int A, int K)
{
    Load(tab, K, "1k.txt");
    long long startTime = GetTickCount64();
    QuickSort(tab, A, K-1);
    long long endTime = GetTickCount64();
    cout << (endTime - startTime) << "ms dla QuickSort" << endl;
    Save(tab, K, "WartLos_QS_1k.txt");
    Time(startTime, endTime, "WartLos_QS_1k_czas.txt");
}

const int MAX_EL = 30;

int _tmain(int argc, _TCHAR* argv[])
{
Structure *punkt = new Structure[MAX_EL];

    void LosujWspolrzedne(Structure *punkt, int MAX_EL);

Structure *punkt1= new Structure[MAX_EL];
void CopyArray(Structure *punkt, Structure *punkt1, int MAX_EL);                      
delete[] punkt;

Save(punkt1, MAX_EL, "1k.txt");

cout<<"Start:"<<endl;

Call_MS(punkt1, 0, MAX_EL);
Call_QS(punkt1, 0, MAX_EL);

delete[] punkt1;
    return 0;
}

2 个答案:

答案 0 :(得分:1)

MergeSort中有MergeSort(tab,A,Z),所以你总是用精确的参数调用自己

它应该是MergeSort(tab,A,st)

答案 1 :(得分:0)

您正在使用MergeSort(tab,A,Z),它使用相同的参数再次调用相同的函数,这将是一个无限递归因此错误。您应该只通过MergeSort(tab,A,sr),这会将您的问题缩小到一半。