Визуализатор сортировки слиянием C ++ - PullRequest
1 голос
/ 28 января 2020

Я пытаюсь создать консольное приложение c ++, которое пытается показать вам, как выглядит сортировка слиянием. Я понимаю сортировку слиянием, и я создал программу, которая организует вектор строк с именем sort_visualize, и каждая строка в нем заполнена многими #. Это полностью рандомизировано для каждой строки. Сортировка слиянием организует их в зависимости от длины, а не от традиционного числа, которое организуют люди. Каждый раз, когда я изменяю вектор, я также очищаю экран и распечатываю весь вектор с помощью функции рисования, чтобы эффект визуально сортировал каждый кадр. Проблема в том, что когда я использую функцию draw для распечатки всей строки sort_visualize, она не распечатывает какие-либо изменения, которые я внесла в нее, и печатает одно и то же снова и снова до конца, когда она, наконец, печатает отсортированный заказ. Что здесь происходит? Я не понимаю Я даже попытался изменить рисование (sort_visualize) на рисование (sort_visualize_), и это показывает небольшие области вектора, над которым он работает. Без разницы. Пожалуйста, попробуйте этот код и сообщите мне любые решения. Спасибо. Вот код:

#include <vector>
#include <iostream>
#include <ctime>
#include "stdlib.h"
#include "windows.h"
using namespace std;


void merge_sort(vector<string> &sort_visual_);
void merge_halves(vector<string>&left, vector<string>& right, vector<string>& sort_visual_);
void draw(vector <string> &sort_visual_);

vector <string> sort_visual;

int main()
{
    srand(time(NULL));
    //vector

    vector<int> num_list;

    //fill vector with random integers
    for (int i = 0; i < 40; i++)
        num_list.push_back(rand() % 40);

    //Fill the visualizer strings which will be bars with #'s
    for (int i = 0; i < num_list.size(); i++)
    {
        sort_visual.push_back("");
        string temp;
        for (int j = 0; j < num_list.at(i); j++)
        {

            temp.push_back('#');
        }
        sort_visual.at(i) = temp;
    }

    draw(sort_visual);
    system("pause");

    //sort function
    merge_sort(sort_visual);

}



void merge_sort(vector<string> &sort_visual_)
{

    //dont do anything if the size of vector is 0 or 1.
    if (sort_visual_.size() <= 1) return;

    //middle of vector is size/2
    int mid = sort_visual_.size() / 2;

    //2 vectors created for left half and right half
    vector<string> left;
    vector<string> right;

    //divided vectors
    for (int j = 0; j < mid; j++)
    {
        left.push_back(sort_visual_[j]); //add all the elements from left side of original vector into the left vector

    }
    for (int j = 0; j < (sort_visual_.size()) - mid; j++)
    {
        right.push_back(sort_visual_[mid + j]);//add all the elements from right side of original vector into the right vector
    }


    //recursive function for dividing the left and right vectors until they are length of 1
    merge_sort(left);
    merge_sort(right);
    //do the actual merging function
    merge_halves(left, right, sort_visual_);
}


void merge_halves(vector<string>&left, vector<string>&right, vector<string>& sort_visual_) //pass in 3 vectors
{

    // sizes of each vector (left and right)
    int nL = left.size();
    int nR = right.size();

    //declaring variables pointint to elements for each vector. i will represent finished produce vector
    int i = 0, j = 0, k = 0;

    //as long as j and k are less than the left and right sizes
    while (j < nL && k < nR)
    {

        if (left[j].length() < right[k].length()) //if the string in the left vector is smaller than string in right vector
        {
            sort_visual_[i] = left[j];//ad the string from left vector in the sort_visuals vector(which is the final product)
            j++;//increment j to move on


        }
        else
        {
            sort_visual_[i] = right[k];//otherwise add the string from right vector in the sort_visual vector

            k++; //increment k to move on

        }
        i++; //i is the final vector, and we have to increment it to set it up to take in the next number


        system("CLS");
        draw(sort_visual);
        Sleep(15);

    }

    while (j < nL)
    {
        sort_visual_[i] = left[j];
        j++; i++;


        system("CLS");
        draw(sort_visual);
        Sleep(15);
    }

    while (k < nR)
    {
        sort_visual_[i] = right[k];
        k++; i++;

        system("CLS");
        draw(sort_visual);
        Sleep(15);
    }



}

void draw(vector <string> &sort_visual)
{
    for (int i = 0; i < sort_visual.size(); i++)
    {
        cout << sort_visual.at(i) << endl;
    }
}

1 Ответ

0 голосов
/ 29 января 2020

В merge_halves вы работаете с sort_visual_, но рисует sort_visual, который является глобальным, который, кажется, не изменился. Убедитесь, что глобалов нет, и будет сложнее ошибаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...