运行截图:
代码:
#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"); }