7.图形化实现快速排序法

运行截图:

代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <graphics.h>
#include <time.h>

//待排序的数据个数
#define N  30
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 800
//矩形区域
RECT r[N];

//用于标识递归退出
int digui_count = 0;

//初始化矩形区域,并实现绘制数组元素
void paint(int *a)
{
    //初始化矩形区域
    for (int i = 0; i < N; i++)
    {
        r[i].left = WINDOW_WIDTH / N*i;
        r[i].top = WINDOW_HEIGHT / 2;
        

        r[i].right = WINDOW_HEIGHT / N*(i + 1);
        r[i].bottom = WINDOW_HEIGHT/2 + 30;
    }

    setcolor(RED);

    //输出数据
    for (int i = 0; i < N; i++)
    {
        char str[100];
        sprintf(str, "%d", a[i]);
        drawtext(str, &r[i], DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    }
}

//交换两个元素
void change(int *num1, int *num2)
{
    int temp = *num1;
    *num1 = *num2;
    *num2 = temp;
}


//快速排序,核心思想:从左边找到第一个最大的,从右边找到一个最小的,然后交换,直到左边下标大于右边下标
//然后交换left和右边下标对应的数据再进行递归运算
void qsort(int *a, int left, int right)
{
    digui_count++;
    int i = left;
    int j = right+1;
    if (i < j)
    {
        do
        {
            do
            {
                i++;
            } while (a[i] < a[left] && i<=right);

            do
            {
                j--;
            } while (a[j] > a[left] && j > left);

            if (i < j)
            {
                cleardevice();
                line(r[i].left + 500 / N / 2, r[i].top, r[i].left + 500 / N / 2, r[i].top - 40);
                line(r[i].left + 500 / N / 2, r[i].top - 40, r[j].left + 500 / N / 2, r[j].top - 40);
                line(r[j].left + 500 / N / 2, r[j].top, r[j].left + 500 / N / 2, r[j].top - 40);
                paint(a);
                Sleep(400);
                change(&a[i], &a[j]);
                cleardevice();
                paint(a);
                Sleep(400);
            }
            
            
        } while (i < j);
        
        //画线提示
        cleardevice();
        //竖线
        line(r[left].left + 500 / N / 2, r[left].top, r[left].left + 500 / N / 2, r[left].top - 40);
        //横线
        line(r[left].left + 500 / N / 2, r[left].top - 40, r[j].left + 500 / N / 2, r[j].top - 40);
        //竖线
        line(r[j].left + 500 / N / 2, r[j].top, r[j].left + 500 / N / 2, r[j].top - 40);
        //画数据
        paint(a);
        Sleep(400);

        //与较小的一个数交换
        change(&a[left], &a[j]);
        //绘制当前的状态
        cleardevice();
        paint(a);
        Sleep(400);

        //左递归
        qsort(a, left, j - 1);
        //递归完成后count--
        digui_count--;
        //右递归
        qsort(a, j+1 , right);
        digui_count--;
    }

    if (digui_count == 1)
    {
        MessageBox(0, "已经完成排序", "提示", 0);
    }
}

void main()
{
    srand(time(0));
    //初始化窗口
    initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
    setbkcolor(LIGHTGRAY);
    cleardevice();

    int a[N];
    for (int i = 0; i < N; i++)
    {
        a[i] = rand() % 100;
    }

    paint(a);
    Sleep(400);
    
    //调用快速排序
    qsort(a,0, N - 1);
    
    cleardevice();
    paint(a);
    system("pause");
}

 

posted @ 2018-01-19 16:53  喵小喵~  阅读(362)  评论(0编辑  收藏  举报