完成对直接插入排序、选择排序、快速排序的过程的可视化

#include <iostream>
#include <Windows.h>
#include <stdio.h>
#include <time.h>
#include<conio.h>
#include <stdlib.h>

using namespace std;

int n = 0, i = 0, j = 0, k = 0, b = 0,  d, temp, cnn = 0, N, p = 0, L = 0, R = 0;
char c, ch;
//直接插入排序、选择排序、快速排序算法

void menu()
{
	cout << "1.直接插入排序" << endl;
	cout << "2.选择排序" << endl;
	cout << "3.快速排序" << endl;
	cout << "4.退出" << endl;
	cout << "请选择:" << endl;
}

void selectSort(int* a, int N)
{
	system("cls");//清除屏幕上显示的信息
	printf("原始数据:\n");//输出原始数据
	for (i = 0; i < N; i++)
		printf("%d  ", a[i]);
	int maxN = 0;

	for (int i = 0; i < 50; i++)
	{
		maxN = max(a[i], maxN);//把数组中的最大元素找出来
	}


	for (i = 0; i < N - 1; i++)
	{
		d = i;//先使d记录排序范围内的第一个元素的位置
		int flag = 0;
		for (j = i + 1; j < N; j++)
		{//找出最大元素,由d记录
			if (a[d] > a[j])
			{
				d = j;
			}
		}
		if (d != i)
		{//如果排序范围的第一个元素(即第i个元素)不是最大值,则将最大元素与第i个元素对调 
			temp = a[d];
			a[d] = a[i];
			a[i] = temp;
			flag = 1;
		}
		//if (flag == 0) break;//未进行排序则不输出
		//if (_kbhit()) system("pause");//检测是否按键来暂停/继续
		printf("第%d步\n", i + 1);
		for (int i = maxN; i > 0; i--)
		{
			for (int j = 0; j < 50; j++)
			{
				if (a[j] >= i)
					cout << "*  ";
				else
					cout << "   ";
			}
			if (i != 1)
				cout << endl;
		}
		cout << endl;
		//system("pause");
		system("cls");//清除屏幕上显示的信息
	}
	system("pause");
}

void blnsertsort1(int* a, int N) {//插入排序
	system("cls");//清除屏幕上显示的信息
	printf("原始数据:\n");//输出原始数据
	for (b = 0; b < N; b++) printf("%d  ", a[b]);
	printf("\n\n");
	int maxN = 0;

	for (int i = 0; i < 50; i++)
	{
		maxN = max(a[i], maxN);//把数组中的最大元素找出来
	}

	for (i = 1; i < N; i++)//循环遍历 
	{
		temp = a[i];//将temp每一次赋值为a[i]  
		j = i - 1;
		while (j >= 0 && temp < a[j])
		{
			a[j + 1] = a[j];//将大的元素往后放 
			j--;
		}
		a[j + 1] = temp;//如果插入的数比之前的大,将a[i]与a[j+1]互换
		if (a[i] != temp) {
			cnn = cnn + 1;
			printf("第%d步:\n", cnn);//输出每一步的不重复过程
			for (int i = maxN; i > 0; i--)
			{
				for (int j = 0; j < 50; j++)
				{
					if (a[j] >= i)
						cout << "*  ";
					else
						cout << "   ";
				}
				if (i != 1)
					cout << endl;
			}
			cout << endl;
			printf("\n\n");
		//	system("pause");
			system("cls");//清除屏幕上显示的信息
		}
	}
	system("pause");
}

void fastSort1(int* R, int low, int high) //快速排序
{
	int i, j, temp;
	i = low;
	j = high;
	int maxN = 0;

	for (int i = 0; i < 50; i++)
	{
		maxN = max(R[i], maxN);//把数组中的最大元素找出来
	}

	if (low < high)
	{
		temp = R[low];    //设置枢轴
		while (i != j)
		{
			while (j > i&& R[j] >= temp)
			{
				--j;
			}
			if (i < j)
			{
				R[i] = R[j];
				++i;
			}

			while (i < j && R[i] < temp)
			{
				++i;
			}
			if (i < j)
			{
				R[j] = R[i];
				--j;
			}
		}
		R[i] = temp;
		printf("第%d步:\n", cnn++);//输出每一步的不重复过程
		for (int i = maxN; i > 0; i--)
		{
			for (int j = 0; j < 50; j++)
			{
				if (R[j] >= i)
					cout << "*  ";
				else
					cout << "   ";
			}
			if (i != 1)
				cout << endl;
		}
		cout << endl;
		system("cls");//清除屏幕上显示的信息

		fastSort1(R, low, i - 1);
		fastSort1(R, i + 1, high);
	}
}

int main()
{
	int sel;
	srand(time(0));
	int a[60];
	for (i == 0; i < 50; i++)
	{
		a[i] = rand() % 49 + 1;//产生1--50的随机数
	}

	system("cls");
	menu();
	cin >> sel;
	if (sel == 4)
		return 0;
	switch (sel)
	{
	case 1:
		blnsertsort1(a, 50);
		break;
	case 2:
		selectSort(a, 50);
		break;
	case 3:
		fastSort1(a, 0, 49);
		break;
	}

	return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐