排序算法演示

#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;
}

排序算法是计算机科学中非常重要的一类算法,它可以将一个无序的数据序列按照一定的规则进行排序,使得数据更加有序,方便后续的操作。目前常见的排序算法有冒泡排序、选择排序、插入排序、归并排序、快速排序等。 下面是一个简单的排序演示的详细设计: 1. 用户界面设计 首先,需要设计一个用户界面,让用户可以选择不同的排序算法进行演示。用户可以选择不同的数据量、数据类型以及排序方式。在界面上需要显示当前正在演示算法名称、当前演示到哪一步、以及数据序列的当前状态。 2. 数据生成 在演示前需要生成一组随机数据,可以通过输入数据量、数据类型等参数来生成。数据可以是整数、浮点数或者字符串等类型。 3. 排序算法实现 实现不同的排序算法,并在演示时展示其过程。在每一步排序完成后,需要将当前状态显示在用户界面上。 4. 演示控制 演示控制包括开始、暂停、继续和停止演示等功能。在演示过程中,需要根据用户的操作来控制演示进程。同时,需要实现自动演示功能,即程序自动按照一定速度进行演示。 5. 相关问题 在演示结束后,需要提供一些相关问题供用户思考,例如:各种排序算法的时间复杂度是多少?快速排序的思想是什么?归并排序和快速排序有何异同之处?等等。 以上就是一个简单的排序算法演示的详细设计。希望对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值