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");
}

 

转载于:https://www.cnblogs.com/xiaochi/p/8317822.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值