📜  排序算法的可视化|选择排序

📅  最后修改于: 2021-04-23 17:06:50             🧑  作者: Mango

先决条件:选择排序

尽管需要很长的代码来理解算法,但人脑仍可以轻松地处理视觉效果。在本文中,已经使用graphics.h库实现了Selection Sort可视化。众所周知,选择排序首先从未排序数组中找到最小元素,然后在每次通过中将其与未排序数组的第一个元素交换。手动分析两种算法之间的数据变得很困难,反之亦然,但是以图形方式绘制则更容易理解。

方法:

  • 白线用于表示数字的长度(9表示垂直向上的9个像素),而白线的位置表示其在数组中的索引。
  • 随机分布的数字的图形表示如下所示。
  • 通过首先将未排序数组中的最小元素着色为绿色,可以显示图形排序。
  • 现在,将其与未排序数组的第一个元素交换,也将这两个数字的颜色交换,如swap_colors()函数
  • 在这里可以增加delay()来查看图中的过渡。

例子:

使用的预定义功能:

  • setcurrentwindow():这是用于设置当前窗口的大小的函数。
  • setcolor(n):此函数用于通过更改n的值来更改光标的颜色。
  • 延迟(N):其中使用由n毫秒延迟程序的函数。它用于减慢过渡速度
  • line(x1,y1,x2,y2):用于绘制从点(x1,y1)到点(x2,y2)的线的函数。 (0,0)是屏幕的左上角,右下角是(n1,n2),其中n1,n2是当前窗口的宽度和高度。使用setcolor()可以将其他图形应用于此行。

以下是可视化选择排序算法的程序:

// C++ program for visualization
// of bubble sort
  
#include "graphics.h"
#include 
  
using namespace std;
  
// Initialize the size
// with the total numbers to sorted
// and the gap to be maintained in graph
vector numbers;
int size = 200;
int gap = 4;
  
// Function for swapping the lines graphically
void swap_colors(int i, int j, int x, int y)
{
  
    // y is the minimum element,
    // first make this number green
    // Now, swapping it by making black again
    // and then draw the pixels
    // for white colour with x value.
    setcolor(GREEN);
    line(j, size, j, size - y);
  
    delay(500);
  
    setcolor(BLACK);
    line(j, size, j, size - y);
  
    setcolor(WHITE);
    line(j, size, j, size - x);
  
    // X is the element to be swapped,
    // first make this number black
    // Now, highlight y with green
    // representing the minimum element
    // and then draw the pixels
    // for white colour with y value.
    setcolor(BLACK);
    line(i, size, i, size - x);
  
    setcolor(GREEN);
    line(i, size, i, size - y);
  
    delay(500);
  
    setcolor(WHITE);
    line(i, size, i, size - y);
}
  
// Function for swapping two numbers
void swap(int* xp, int* yp)
{
    int temp = *xp;
    *xp = *yp;
    *yp = temp;
}
  
// Selection sort function
void selsort()
{
    for (int i = 0; i < size - 1; i++) {
  
        // Find the minimum element
        // in unsorted array
        int min_idx = i;
  
        for (int j = i + 1; j < size; j++) {
            if (numbers[j] < numbers[min_idx]) {
                min_idx = j;
            }
        }
  
        // Swap the found minimum element
        // with the first element
        // delay(500);
        swap(&numbers[min_idx],
             &numbers[i]);
  
        // Function to show transition in swapping
        swap_colors(gap * i + 1,
                    gap * (min_idx) + 1,
                    numbers[min_idx],
                    numbers[i]);
    }
}
  
// Driver program
int main()
{
  
    // auto detection of screen size
    int gd = DETECT, gm;
    int wid1;
  
    // Graph initialization
    initgraph(&gd, &gm, NULL);
  
    // setting up window size (gap*size) * (size)
    wid1 = initwindow(gap * size + 1, size + 1);
    setcurrentwindow(wid1);
  
    // Initializing the array
    for (int i = 1; i <= size; i++)
        numbers.push_back(i);
  
    // Find a seed and shuffle the array
    // to make it random.
    // Here  different type of array
    // can be taken to results
    // such as nearly sorted, already sorted,
    // reverse sorted to visualize the result
    unsigned seed
        = chrono::system_clock::now()
              .time_since_epoch()
              .count();
  
    shuffle(numbers.begin(),
            numbers.end(),
            default_random_engine(seed));
  
    // Initial plot of numbers in graph taking
    // the vector position as x-axis and its
    // corresponding value will be the height of line.
    for (int i = 1; i <= gap * size; i += gap) {
        line(i, size, i, (size - numbers[i / gap]));
    }
  
    // Delay the code
    delay(200);
  
    // Call sort
    selSort();
  
    for (int i = 0; i < size; i++) {
        cout << numbers[i] << " ";
    }
    cout << endl;
  
    // Wait for sometime .
    delay(5000);
  
    // Close the graph
    closegraph();
  
    return 0;
}
输出:

可视化:

  • 输入可视化:

    未排序的数组

  • 输出可视化:

    使用选择排序对数组排序