#include <iostream>
#include <cstdio>
#include <algorithm>
#include <Windows.h>
#include <ctime>
using namespace std;
void gotoxy(int x, int y)
{
COORD pos = {x,y};
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄
SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置
}
void show(int arr[], int n, int a, int b, int jzz = -1)
{
//system("cls");
for (int i = 0; i < n; ++i)
{
if (i == jzz)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_INTENSITY |
//FOREGROUND_RED |
FOREGROUND_GREEN |
FOREGROUND_BLUE
);
else
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_INTENSITY |
FOREGROUND_RED |
FOREGROUND_GREEN
//FOREGROUND_BLUE
);
for (int j = 0; j < n; ++j)
{
gotoxy(i * 2, j + 1);
if (j >= n - arr[i])
if (i == a || i == b)
cout << "□";
else cout << "■";
else
cout << " ";
}
}
}
void upset(int arr[], int n)
{
srand(time(0));
int x = rand() % n + n;
for (int i = 0; i < x; ++i)
{
swap(arr[rand() % n], arr[rand() % n]);
srand(rand());
}
}
void init(int arr[], int n)
{
for (int i = 0; i < n; ++i)
{
arr[i] = i + 1;
}
}
void BSort(int arr[], int n, int _t)
{
bool b = 0;
for (int i = 1; i < n; ++i)
{
b = 0;
for (int j = 0; j <= n - i - 1; ++j)
{
if (arr[j] > arr[j + 1])
{
b = 1;
show(arr, n, j, j + 1);
if (GetAsyncKeyState('Q'))
Sleep(_t / n);
else if (GetAsyncKeyState('S'))while (GetAsyncKeyState('S'));
else Sleep(_t);
swap(arr[j], arr[j + 1]);
show(arr, n, j, j + 1);
if (GetAsyncKeyState('Q'))
Sleep(_t / n);
else if (GetAsyncKeyState('S'))while (GetAsyncKeyState('S'));
else Sleep(_t);
}
else
{
show(arr, n, j, j + 1);
if (GetAsyncKeyState('Q'))
Sleep(_t / n);
else if (GetAsyncKeyState('S'))while (GetAsyncKeyState('S'));
else Sleep(_t);
}
}
if (b == 0)break;
}
show(arr, n, -1, -1);
cout << endl;
system("pause");
}
void CSort(int arr[], int n, int _t)
{
int m = 101, m2 = 0, lp = 0;
for (int i = 1; i < n; ++i)
{
for (int j = lp; j < n; ++j)
{
if (arr[j] < m)
{
m = arr[j];
m2 = j;
show(arr, n, m2, j);
if (GetAsyncKeyState('Q'))
Sleep(_t / n);
else if (GetAsyncKeyState('S'))while (GetAsyncKeyState('S'));
else Sleep(_t);
}
else
{
show(arr, n, m2, j, m2);
if (GetAsyncKeyState('Q'))
Sleep(_t / n);
else if (GetAsyncKeyState('S'))while (GetAsyncKeyState('S'));
else Sleep(_t);
}
}
show(arr, n, lp, m2);
if (GetAsyncKeyState('Q'))
Sleep(_t / n);
else if (GetAsyncKeyState('S'))while (GetAsyncKeyState('S'));
else Sleep(_t);
swap(arr[m2], arr[lp]);
show(arr, n, lp, m2);
if (GetAsyncKeyState('Q'))
Sleep(_t / n);
else if (GetAsyncKeyState('S'))while (GetAsyncKeyState('S'));
else Sleep(_t);
++lp;
m = 101;
}
show(arr, n, -1, -1);
cout << endl;
system("pause");
}
int partition(int a[], int low, int high, int _t, int n)
{
int x = a[low]; //将该数组第一个元素设置为比较元素
int i = low; //指向数组头的指针
int j = high; //指向数组尾的指针
while (i < j)
{
while (i < j && a[j] >= x)
j--; //从右至左找到第一个小于比较元素的数
while (i < j && a[i] <= x)
i++; //从左至右找到第一个大于比较元素的数
/*需要注意的是,这里的j--与i++的顺序不可以调换!
如果调换了顺序,i会走过头,以至于将后面较大的元素交换到数组开头*/
//将大数与小数交换
if (i != j)
{
show(a, n, i, j, high);
if (GetAsyncKeyState('Q'))
Sleep(_t / n);
else if (GetAsyncKeyState('S'))while (GetAsyncKeyState('S'));
else Sleep(_t);
swap(a[i], a[j]);
show(a, n, i, j, high);
if (GetAsyncKeyState('Q'))
Sleep(_t / n);
else if (GetAsyncKeyState('S'))while (GetAsyncKeyState('S'));
else Sleep(_t);
}
}
show(a, n, low, i, high);
if (GetAsyncKeyState('Q'))
Sleep(_t / n);
else if (GetAsyncKeyState('S'))while (GetAsyncKeyState('S'));
else Sleep(_t);
swap(a[low], a[i]); //将比较元素交换到期望位置
show(a, n, low, i, high);
if (GetAsyncKeyState('Q'))
Sleep(_t / n);
else if (GetAsyncKeyState('S'))while (GetAsyncKeyState('S'));
else Sleep(_t);
return i; //返回比较元素的位置
}
void QSort(int a[], int low, int high, int _t, int n)
{
if (low < high)
{
int i = partition(a, low, high, _t, n); //划分数组并获取比较元素的位置
QSort(a, low, i - 1, _t, n); //对比较元素左边进行排序
QSort(a, i + 1, high, _t, n); //对比较元素右边进行排序
}
}
void menu()
{
while (1)
{
cout << "1.冒泡排序\n";
cout << "2.快速排序\n";
cout << "3.选择排序\n";
cout << "选择:";
int c, n, arr[100];
double t;
cin >> c;
switch (c)
{
case 1:
cout << "请输入元素个数(小于等于100):";
cin >> n;
cout << "请输入停顿时间(秒):";
cin >> t;
system("cls");
init(arr, n);
upset(arr, n);
cout << "待排数组元素:";
for (int i = 0; i < n; ++i)
{
cout << arr[i] << " ";
}
cout << endl;
system("pause");
BSort(arr, n, t * 1000);
break;
case 2:
cout << "请输入元素个数(小于等于100):";
cin >> n;
cout << "请输入停顿时间(秒):";
cin >> t;
system("cls");
init(arr, n);
upset(arr, n);
cout << "待排数组元素:";
for (int i = 0; i < n; ++i)
{
cout << arr[i] << " ";
}
cout << endl;
system("pause");
QSort(arr, 0, n, t * 1000, n);
break;
case 3:
cout << "请输入元素个数(小于等于100):";
cin >> n;
cout << "请输入停顿时间(秒):";
cin >> t;
system("cls");
init(arr, n);
upset(arr, n);
cout << "待排数组元素:";
for (int i = 0; i < n; ++i)
{
cout << arr[i] << " ";
}
cout << endl;
system("pause");
CSort(arr, n, t * 1000);
break;
default:
system("cls");
cout << "输入错误\n";
}
}
cout << endl;
}
int main()
{
menu();
return 0;
}
排序算法演示
最新推荐文章于 2024-10-15 12:51:59 发布