【问题标题】:C++ Merge Sort VisualizerC++ 合并排序可视化工具
【发布时间】:2020-05-14 08:19:08
【问题描述】:

我正在尝试制作一个 C++ 控制台应用程序,试图向您展示合并排序的外观。我了解归并排序,我创建了一个程序,该程序组织了一个名为 sort_visualize 的字符串向量,其中的每个字符串都填充了许多 #。这对于每个字符串都是完全随机的。合并排序将根据长度组织它们,而不是传统的数字组织人们使用它。每次对矢量进行更改时,我也会清屏并通过绘图功能打印出整个矢量,以使其具有每帧主动可视化排序的效果。问题是,当我使用 draw 函数打印出整个 sort_visualize 字符串时,它不会打印出我对它所做的任何更改,而是一遍又一遍地打印出相同的内容,直到最后打印出来排序的顺序。到底是怎么回事?我不明白。我什至尝试将 draw(sort_visualize) 更改为 draw(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;
    }
}

【问题讨论】:

  • 在过去,我们称之为调试:显示排序的执行情况(如每一步/交换的数组内容)。

标签: c++ algorithm sorting vector


【解决方案1】:

在 merge_halves 中,您使用 sort_visual_ 但绘制 sort_visual,它是一个似乎没有改变的全局。确保没有全局变量,这样会更难出错。

【讨论】:

  • sort_visual_ 不只是对sort_visual 的引用吗?
  • 好点,它是参考,但最好保持本地化。
  • 我的意思是原来的被修改了,因为局部变量只是对那个原始向量的引用,不是吗?
  • 我同意你的观点,我的观点是,如果你有全局变量,它会非常令人困惑,而且很容易像我一样犯错误,并认为它们不是单独的对象。
  • 但事实证明你是对的。通过递归调用merge_sort(left/right)sort_visual_ 接受leftright 字符串。他们在整个原始字符串上调用draw,而不是现在指的是本地left/right 子字符串向量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2016-05-25
  • 2011-11-09
  • 1970-01-01
  • 2011-11-17
相关资源
最近更新 更多