本人在开始学习C语言的最初也是对与这些算法使用的不是特别明白,找了很久的资料才弄懂。
因为一个偶然的机会写下这些代码。希望能帮助小白门学习这些算法,尽快入门。
所有资料文档来源百度百科。
/*
start_time:2019/2/28
end_time: 2019/3/2
event:排序算法动画演示程序
requirements:实现数据排序算法(冒泡、选择和插入)的动画效果
creator:清水
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<Windows.h>
#include<time.h>
void color(short x);
void Bubble_sort(void); //冒泡排序动画效果
int bubble_sort(void); //冒泡排序测试效果
void Select_sort(void); //选择排序动画效果
int select_sort(void); //选择排序测试效果
void Insert_sort(void); //插入排序动画效果
int insert_sort(void); //插入排序测试效果
int Selection(int n){ //选择哪种排序测试效果
int selection;
printf("\n我是小艾,下面请您选择您需要的测试排序吧!");
printf("\n 请输入您需要选择排序前面的编号吧!");
printf("\n\n\n1: 冒泡排序测试\n2: 选择排序测试\n3:插入排序测试\n4: 退出!\n");
while(scanf("%d",&selection) != EOF){
if(selection == 1){
bubble_sort();
return Selection(1);
}else if (selection == 2){
select_sort();
return Selection(1);
}else if( selection == 3){
insert_sort();
return Selection(1);
}else{
printf("\n小艾,谢谢您的使用。祝您生活愉快!再见。\n");
printf("\t\t\t开发者:清水");
return 0;
}
}
}
int main()
{
system("color f3") ;
printf("\n\n***********欢迎来到排序动画系统************\n");
Sleep(3000); //暂停一秒
system("CLS"); //清空屏幕数据
printf("\n\n************您好,我是您的助手,我叫小艾。我将帮助您理解各种排序原理************\n") ;
Sleep(3000); //暂停一秒
system("CLS"); //清空屏幕数据
printf("\n\n**********下面请跟着小艾一起学习各种排序吧***********\n");
Sleep(3000); //暂停一秒
system("CLS"); //清空屏幕数据
printf("\n\n*********下面我将为您演示各种排序动画*************\n");
Sleep(3000); //暂停一秒
system("CLS"); //清空屏幕数据
printf("\n\n****首先小艾将为您展示冒泡排序动画效果图****");
Bubble_sort();
Sleep(3000); //暂停一秒
system("CLS"); //清空屏幕数据
Sleep(1000);
system("color f3") ;
printf("\n\n****接下来小艾将为您展示选择排序动画效果图****");
Sleep(3000); //暂停一秒
Select_sort();
Sleep(3000); //暂停一秒
system("CLS"); //清空屏幕数据
system("color f3") ;
printf("\n\n****接下来小艾将为您展示插入排序动画效果图****\n");
Sleep(3000); //暂停一秒
system("CLS"); //清空屏幕数据
system("color f3") ;
Insert_sort();
system("CLS"); //清空屏幕数据
system("color f3") ;
Selection(1);
return 0;
}
void color(short x) //自定义函根据参数改变颜色
{
if(x>=0 && x<=15)//参数在0-15的范围颜色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x); //只有一个参数,改变字体颜色
else//默认的颜色白色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
void Bubble_sort(void){
system("color f3") ;
printf("\n\n\n冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。");
Sleep(2000);
printf("\n它重复地走访过要排序的元素列,依次比较两个相邻的元素,");
printf("如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。\n");
Sleep(2000);
printf("走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。");
Sleep(2000);
printf("\n这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端");
printf("(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,");
printf("故名“冒泡排序”\n\n\n") ;
color(14); printf(" *********** 冒泡排序动画效果 ******** ");
int temp_1[] = { 1, 151, 54, 4864, 48, 184, 652, 156, 153, 152, 51};
int temp;
int sum = 1;
int save_1,save_2;
for(int i = 10;i > 0; i--){
for(int j = 0;j < i;j++){
color(3);
if(temp_1[j]>temp_1[j+1]){
temp = temp_1[j];
temp_1[j] = temp_1[j+1];
temp_1[j+1] = temp;
save_1 = j;
save_2 = j+1;
}
printf("\n第%2d次排序结果: ",sum++);
for(int k = 0; k<11; k++){
color(3);
if(k == save_1 || k == save_2){
color(15);
}
printf("%d ",temp_1[k]);
}
Sleep(1000) ;
}
}
}
int bubble_sort(void){
system("CLS"); //清空屏幕数据
system("color f3") ;
int a[100];
int n,swap;
printf("请输入您需要输入的排序数量大小:");
scanf("%d",&n);
printf("\n请输入您需要输入的排序每个数据:");
printf("\n") ;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i = n-1;i > 0; i--){
for(int j = 0 ;j < i;j++ ){
if(a[j]>a[j+1]){
swap = a[j+1];
a[j+1] = a[j];
a[j] = swap;
}
}
}
printf("您输入数据排序后的效果:");
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
return 1;
}
void Select_sort(void)
{
system("color f3") ;
printf("\n\n\n选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)\n") ;
Sleep(2000) ;
printf("的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。\n") ;
Sleep(2000) ;
printf("以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。\n\n\n") ;
Sleep(2000) ;
int i,j,min,t;
int a[] = { 1, 151, 54, 4864, 48, 184, 652, 156, 153, 152, 51};
int save_1,save_2,sum=1;
for(i=0;i<10;i++)
{
color(3);
min=i; //查找最小值
for(j=i+1;j<11;j++){
if(a[min]>a[j]){
min=j; //交换
save_1=min;
save_2=j;
}
}
if(min != i)
{
t=a[min];
a[min]=a[i];
a[i]=t;
}
printf("\n第%2d次排序结果: " ,sum++);
for(int k = 0; k<11; k++){
color(3);
if(k == save_1 || k == save_2){
color(15);
}
printf("%d ",a[k]);
}
Sleep(1000) ;
}
}
int select_sort(void){
system("CLS"); //清空屏幕数据
system("color f3") ;
int a[100];
int n,swap;
printf("\n请输入您需要输入的排序数量大小:");
scanf("%d",&n);
printf("\n请输入您需要输入的排序每个数据:");
printf("\n") ;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int i,j,min,t;
for(i=0;i<n;i++)
{
min=i;//查找最小值
for(j=i+1;j<n;j++)
{
if(a[min]>a[j])
min=j;//交换
}
if(min!=i)
{
t=a[min];
a[min]=a[i];
a[i]=t;
}
}
printf("您输入数据排序后的效果:");
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
return 1;
}
void Insert_sort(void)
{
system("color f3") ;
printf("\n\n****为您展示插入排序动画效果图****");
Sleep(2000);
printf("\n有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,");
Sleep(2000);
printf("\n这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,");
Sleep(2000);
printf("\n从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。");
Sleep(2000);
printf("\n是稳定的排序方法。插入算法把要排序的数组分成两部分:");
Sleep(2000);
printf("\n第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),");
Sleep(2000);
printf("\n而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。");
Sleep(2000);
printf("\n插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。\n\n\n");
int a[] = { 1, 151, 54, 4864, 48, 184, 652, 156, 153, 152, 51};
int i,j;
int temp,sum=1,save_1,save_2;
for(i=1;i<11;i++)
{
color(3);
temp=*(a+i);
for(j=i;j>0&&*(a+j-1)>temp;j--)
{
save_1=j;
save_2=j-1;
*(a+j)=*(a+j-1);
color(3);
if(sum == 20){
printf("\n 第%2d次排序结果: ",sum++);
}else
printf("\n 第%2d次排序结果: ",sum++);
for(int k = 0; k<11; k++){
color(3);
if(k == save_1 || k == save_2){
color(15);
}
printf("%d ",a[k]);
}
Sleep(1000) ;
}
*(a+j)=temp;
}
Sleep(1000);
}
int insert_sort(void){
system("CLS"); //清空屏幕数据
system("color f3") ;
int a[100];
int n,swap;
printf("\n请输入您需要输入的排序数量大小:");
scanf("%d",&n);
printf("\n请输入您需要输入的排序每个数据:");
printf("\n") ;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int i,j;
int temp;
for(i=1;i<n;i++)
{
temp=*(a+i);
for(j=i;j>0&&*(a+j-1)>temp;j--)
{
*(a+j)=*(a+j-1);
}
*(a+j)=temp;
}
printf("您输入数据排序后的效果:");
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
return 1;
}
代码显示效果图
代码可以直接复制粘贴到编译器上运行,可以自己亲自测试
代码中使用#include<Windows.h>系统头文件—>改变字体颜色,背景布局等
#include<time.h>时间头文件—>短暂停止代码显示,以达到动态效果