学校为了提高软件工程能力什么的就举行了这个神奇的比赛
(大一会点点C语言的菜鸡嘻嘻嘻不喜勿喷)

其实吧用C语言实现它并不困难
它能够录入使用者要进行排序的数据,还能根据要求以不同的速度进行演示。
我们小组制作的这个程序提供了冒泡排序、选择排序、快速排序、插入排序、归并排序五种排序方式。在演示过程中将每一步的排序都显示在屏幕上。
而且在排序演示的过程中,可以按下空格键来进行暂停和继续。
引导用户进行选择的过程中,还提供了返回上一级和退出程序的功能。
排序结束以后,会在屏幕下方统计出这次排序所消耗的时间,此程序的容错能力较强,输入错误数据的时候,具有良好的错误处理能力
话不多说直接上代码叭

#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <conio.h>
clock_t start,stop;
double duration;
int n=0,i=0,j=0,k=0,b=0,speed,d,temp,cnn=0,N,p=0,L=0,R=0,a[100];
char c,ch;
void selectSpeed();//选择速度
void handleSelectSpeed(char c);//处理所选择的速度
void selectSortBy();//选择升降序
void handleSelectSortBy(char c);//处理所选择的升降序
void selectAlg1();//选择算法(升序)
void handleSelectAlg1(char c);//处理所选择的算法(升序)
void selectAlg2();//选择算法(降序)
void handleSelectAlg2(char c);//处理所选择的算法(降序)
void bubleSort1(int*a, int N);//冒泡排序(升序)
void bubleSort2(int*a, int N);//冒泡排序(降序)
void selectSort1(int*a,int N);//选择排序(升序)
void selectSort2(int *a,int N);//选择排序(降序)
void fastSort1(int left,int right,int *a);//快速排序(升序)
void fastSort2(int left,int right,int *a);//快速排序(降序)
void clockFastsort1(int left,int right,int *a);//对快速排序(升序)计时
void clockFastsort2(int left,int right,int *a);//对快速排序(降序)计时
void blnsertsort1(int *a,int N);//插入排序(升序)
void blnsertsort2(int *a,int N);//插入排序(降序)
void merge1(int *a,int L,int M,int R);//升序归并处理
void merge2(int *a,int L,int M,int R);//降序归并处理
void mergeSort1(int *a,int L,int R);//归并排序(升序)
void mergeSort2(int *a,int L,int R);//归并排序(将序)
void clockMergesort1(int *a,int L,int R);//对归并排序(升序)计时
void clockMergesort2(int *a,int L,int R);//对归并排序(降序)计时
void selectExit();//选择退出菜单
void handleSelectExit(char c);//处理选择退出菜单
void toExit();//退出程序 /********************************
函数名:main
函数功能:显示欢迎界面并录入数据
函数输入参数:无
函数返回值:无
**********************************/
int main(void){system("cls");//清除屏幕上显示的信息printf("\n");printf("        ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("        ┃            WELCOME!            ┃\n"); printf("        ┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n");printf("        ┃                                ┃\n");printf("        ┃   欢迎使用Hello world排序软件  ┃\n");    printf("        ┃                                ┃\n");printf("        ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n\n");printf("\n       温馨提示:软件支持暂停/继续排序的功能\n      您可以在排序过程中按下SPACE键来暂停/继续\n\n");printf("\n            请按下ENTER键进入下一界面\n\n");getchar( );fflush(stdin);//清空输入缓冲区system("cls");//清除屏幕上显示的信息printf("\n请输入您要排序数据的个数:\n"); scanf("%d",&N);//确定N值便于后续排序printf("\n请输入您要排序的数据(%d个):\n",N);for(i=0;i<N;i++) scanf("%d",&a[i]);//录入数据数组a fflush(stdin);selectSpeed();//引用选择速度函数
}/********************************
函数名:selectSpeed
函数功能:显示速度选择菜单
函数输入参数:无
函数返回值:无
**********************************/
void selectSpeed(){system("cls");//清除屏幕上显示的信息printf("\n");printf("        ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("        ┃         速度选择菜单         ┃\n"); printf("        ┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n");printf("        ┃            1.高速            ┃\n");printf("        ┃            2.中速            ┃\n");    printf("        ┃            3.低速            ┃\n");printf("        ┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n");printf("        ┃          4.返回上一级        ┃\n");  printf("        ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n\n");printf("\n          请按下相应数字键并回车完成操作\n");c=getchar( );   fflush(stdin);//清空输入缓冲区handleSelectSpeed(c); //引用处理所选择速度的函数
} /********************************
函数名:handleSelectSpeed
函数功能:处理所选择的速度
函数输入参数:字符c
函数返回值:无
**********************************/
void  handleSelectSpeed(char c){switch(c)
{case '1':speed=500;selectSortBy();break;//设定高速为500ms的延迟,并引用显示排序方式菜单函数 case '2':speed=1250;selectSortBy();break;//设定中速为1250ms的延迟 ,并引用显示排序方式菜单函数case '3':speed=2000;selectSortBy();break;//设定低速为2000ms的延迟 ,并引用显示排序方式菜单函数case '4':main();break;//返回主菜单                default:printf("您的输入有误!请重试:\n");c=getchar( );fflush(stdin);handleSelectSpeed(c);//递归式容错性处理 }
}/********************************
函数名:selectSortBy
函数功能:显示排序方式菜单
函数输入参数:无
函数返回值:无
**********************************/
void selectSortBy(){system("cls");//清除屏幕上显示的信息 printf("\n");printf("        ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("        ┃         排序方式选择菜单        ┃\n"); printf("        ┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n");printf("        ┃            1.升序排序           ┃\n");printf("        ┃            2.降序排序           ┃\n");printf("        ┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n");   printf("        ┃            3.返回上一级         ┃\n");printf("        ┃            4.退出程序           ┃\n"); printf("        ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n\n");printf("\n          请按下相应数字键并回车完成操作\n");c=getchar( );    fflush(stdin);//清空输入缓冲区handleSelectSortBy(c);//引用处理排序方式子菜单函数
}   /********************************
函数名:handleSelectSortBy
函数功能:处理排序方式子菜单
函数输入参数:字符c
函数返回值:无
**********************************/
void  handleSelectSortBy(char c){switch(c)
{case '1':selectAlg1();break;//引用处理升序算法函数 case '2':selectAlg2();break;//引用处理降序算法函数case '3':selectSpeed();break;//引用选择速度函数case '4':toExit();break;//引用退出程序函数default:printf("您的输入有误!请重试:\n");c=getchar( );fflush(stdin);handleSelectSortBy(c);//递归式容错性处理 }
}   /********************************
函数名:selectAlg1
函数功能:显示升序算法
函数输入参数:数组 数据个数
函数返回值:无
**********************************/
void selectAlg1( ){system("cls"); //清除屏幕上显示的信息printf("\n");printf("        ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("        ┃           算法选择菜单           ┃\n"); printf("        ┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n");printf("        ┃            1.冒泡排序            ┃\n");printf("        ┃            2.选择排序            ┃\n");   printf("        ┃            3.快速排序            ┃\n");printf("        ┃            4.插入排序            ┃\n");printf("        ┃            5.归并排序            ┃\n");printf("        ┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n");printf("        ┃            6.返回上一级          ┃\n");printf("        ┃            7.退出程序            ┃\n");           printf("        ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n\n");printf("\n          请按下相应数字键并回车完成操作\n");c=getchar( );   fflush(stdin);//清空输入缓冲区handleSelectAlg1(c);//引用处理升序算法子菜单的函数
}/********************************
函数名:handleSelectAlg1
函数功能:处理升序算法子菜单
函数输入参数:字符c
函数返回值:无
**********************************/
void handleSelectAlg1(char c){switch(c)
{case '1':bubleSort1(a,N);break;//引用冒泡排序函数case '2':selectSort1(a,N);break;//引用选择排序函数case '3':clockFastsort1(0,N-1,a);break;   //引用快速排序函数                  case '4':blnsertsort1(a,N);break;//引用插入排序函数case '5':clockMergesort1(a,L,R);break;//引用归并排序函数case '6':selectSortBy();break;//引用显示排序方式菜单函数case '7':toExit();break;//引用退出程序函数default:printf("您的输入有误!请重试:\n");c=getchar( );fflush(stdin);handleSelectAlg1(c);//递归式容错性处理 }
}/********************************
函数名:selectAlg2
函数功能:显示降序算法
函数输入参数:数组 数据个数
函数返回值:无
**********************************/
void selectAlg2( ){system("cls");//清除屏幕上显示的信息printf("\n");printf("        ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("        ┃           算法选择菜单           ┃\n"); printf("        ┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n");printf("        ┃            1.冒泡排序            ┃\n");printf("        ┃            2.选择排序            ┃\n");    printf("        ┃            3.快速排序            ┃\n");printf("        ┃            4.插入排序            ┃\n");printf("        ┃            5.归并排序            ┃\n");printf("        ┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n");printf("        ┃            6.返回上一级          ┃\n");printf("        ┃            7.退出程序            ┃\n");           printf("        ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n\n");printf("\n          请按下相应数字键并回车完成操作\n"); c=getchar( );fflush(stdin);//清空输入缓冲区handleSelectAlg2(c);//引用处理降序算法子菜单的函数
}/********************************
函数名:handleSelectAlg2;
函数功能:处理降序算法子菜单
函数输入参数:字符c
函数返回值:无
**********************************/
void handleSelectAlg2(char c){switch(c)
{case '1':bubleSort2(a,N);break;//引用冒泡排序函数case '2':selectSort2(a,N);break;//引用选择排序函数case '3':clockFastsort2(0,N-1,a);break;   //引用快速排序函数                  case '4':blnsertsort2(a,N);break;//引用插入排序函数case '5':clockMergesort2(a,L,R);break;//引用归并排序函数case '6':selectSortBy();break;//引用显示排序方式菜单函数case '7':toExit();break;//引用退出程序函数default:printf("您的输入有误!请重试:\n");c=getchar( );fflush(stdin);handleSelectAlg2(c);//递归式容错性处理 }
}/********************************
函数名:bubleSort1
函数功能:进行升序的冒泡排序
函数输入参数:数组 数据个数
函数返回值:无
**********************************/
void bubleSort1(int *a, int N){system("cls");//清除屏幕上显示的信息printf("原始数据:\n"); for(b=0;b<N;b++) printf("%d  ",a[b]);//输出原始数据printf("\n\n");Sleep(speed);start=clock();//开始计时        for(j=0;j<N;j++) {//两个for循环,每次取出一个元素跟数组的其他元素比较,将最大的元素排到最后。  int flag=0;for(i=0;i<N-j-1;i++) { //外循环一次,就排好一个数,并放在后面,所以比较前面n-j-1个元素即可if(a[i]>a[i+1]) {temp=a[i];a[i]=a[i+1];a[i+1]=temp;flag=1;}      }if(flag==0) break;//未进行排序则不输出if (kbhit()) system("pause");//检测是否按键来暂停/继续printf("第%d步:\n",j+1);for(k=0;k<N;k++){printf("%d  ",a[k]);}printf("\n\n");Sleep(speed);                            }   Sleep(speed);stop=clock();//结束计时 duration=(double)(stop-start)/CLK_TCK;printf("本次排序共耗时: %.0f(秒)\n\n",duration);system("pause");selectExit();//引用选择退出菜单函数
}/********************************
函数名:bubleSort2
函数功能:进行降序的冒泡排序
函数输入参数:数组 数据个数
函数返回值:无
**********************************/
void bubleSort2(int *a, int N){system("cls");//清除屏幕上显示的信息printf("原始数据:\n");for(b=0;b<N;b++) printf("%d  ",a[b]);//输出原始数据printf("\n\n");Sleep(speed);start=clock();//开始计时                             for(j=0;j<N-1;j++) {//两个for循环,每次取出一个元素跟数组的其他元素比较,将最小的元素排到最后。int flag=0;for(i=0;i<N-j-1;i++) {//外循环一次,就排好一个数,并放在后面,所以比较前面n-j-1个元素即可if(a[i]<a[i+1]) {temp=a[i];a[i]=a[i+1];a[i+1]=temp;flag=1;}      }if(flag==0) break;//未进行排序则不输出 if (kbhit()) system("pause");//检测是否按键来暂停/继续printf("第%d步:\n",j+1);for(k=0;k<N;k++){printf("%d  ",a[k]);}printf("\n\n");Sleep(speed);                    } Sleep(speed);stop=clock();//结束计时duration=(double)(stop-start)/CLK_TCK;printf("本次排序共耗时: %.0f(秒)\n\n",duration);system("pause");selectExit();//引用选择退出菜单函数
}/********************************
函数名:selectSort1
函数功能:升序的选择排序
函数输入参数:数组 数据个数
函数返回值:无
**********************************/
void selectSort1(int *a,int N){system("cls");//清除屏幕上显示的信息Sleep(speed);start=clock();//开始计时   printf("原始数据:\n");//输出原始数据for(i=0;i<N;i++) printf("%d  ",a[i]);printf("\n\n");Sleep(speed);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);int i=0; for(i=0;i<N;i++)printf("%d  ",a[i]);printf("\n\n");Sleep(speed);  }stop=clock();//结束计时 duration=(double)(stop-start)/CLK_TCK;printf("本次排序共耗时: %.0f(秒)\n\n",duration);system("pause");selectExit();//引用选择退出菜单函数
}/********************************
函数名:selectSort2
函数功能:降序的选择排序
函数输入参数:数组 数据个数
函数返回值:无
**********************************/
void selectSort2(int *a,int N){system("cls");//清除屏幕上显示的信息Sleep(speed);start=clock();//开始计时   printf("原始数据:\n");//输出原始数据for(i=0;i<N;i++) printf("%d  ",a[i]);printf("\n\n");Sleep(speed);for(i=0;i<N-1;i++){//n个数据需进行n-1趟比较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);int i=0;   for(i=0;i<N;i++)printf("%d  ",a[i]);printf("\n\n");Sleep(speed);  }stop=clock();//结束计时 duration=(double)(stop-start)/CLK_TCK;printf("本次排序共耗时: %.0f(秒)\n\n",duration);system("pause");selectExit();//引用选择退出菜单函数
}/********************************
函数名:fastSort1
函数功能:升序的快速排序
函数输入参数:数组 数据个数
函数返回值:无
**********************************/
void fastSort1(int left,int right,int *a){  int flag=0;i=left;//从数组的最左边和最右边分别开始寻找比最左大的数,并分别放到左边和右边j=right;temp=a[left];while(i<j){//判断数据的大小while(a[j]>=temp&&j>i)j--;while(a[i]<=temp&&i<j)i++;if(a[i]>a[j]){n=a[i];a[i]=a[j];a[j]=n;flag=1;}}if(a[left]>a[i]){//将标志数与最后剩下的数进行交换a[left]=a[i];a[i]=temp;if(a[i]==temp)flag=1;}if(flag==1){//输出每一步的不重复过程b++;if (kbhit()) system("pause");//检测是否按键来暂停/继续printf("第%d步:\n",b);for(c=0;c<N;c++)printf("%d  ",a[c]);printf("\n\n");Sleep(speed);printf("\n");}if(left<i-1)//递归,重复上述步骤fastSort1(left,i-1,a);if(right>i+1)fastSort1(i+1,right,a);
}/********************************
函数名:fastSort2
函数功能:降序的快速排序
函数输入参数:数组 数据个数
函数返回值:无
**********************************/
void fastSort2(int left,int right,int *a){  int flag=0;i=left;//从数组的最左边和最右边分别开始寻找比最左小的数,并分别放到左边和右边j=right;temp=a[left];while(i<j){//判断数据的大小while(a[j]<=temp&&j>i)j--;while(a[i]>=temp&&i<j)i++;if(a[i]<a[j]){n=a[i];a[i]=a[j];a[j]=n;flag=1;}}if(a[left]<a[i]){//将标志数与最后剩下的数进行交换a[left]=a[i];a[i]=temp;if(a[i]==temp)flag=1;}if(flag==1){//输出每一步的不重复过程b++;if (kbhit()) system("pause");//检测是否按键来暂停/继续printf("第%d步:\n",b);for(c=0;c<N;c++)printf("%d  ",a[c]);printf("\n\n");Sleep(speed);printf("\n");}if(left<i-1)//递归,重复上述步骤fastSort2(left,i-1,a);if(right>i+1)fastSort2(i+1,right,a);
}/********************************
函数名:clockFastsort1
函数功能:升序的快速排序及计时
函数输入参数:数组 数据个数
函数返回值:无
备注:此函数的建立是由于递归的特性
**********************************/
void clockFastsort1(int left,int right,int *a){system("cls");//清除屏幕上显示的信息printf("原始数据:\n");//输出原始数据for(i=0;i<N;i++) printf("%d  ",a[i]);printf("\n\n");Sleep(speed);start=clock();//开始计时b=0;//避免因重复调用b而导致后续输出错误 fastSort1(0,N-1,a);//引用升序快速排序函数 stop=clock();//结束计时 duration=(double)(stop-start)/CLK_TCK;printf("本次排序共耗时: %.0f(秒)\n\n",duration);system("pause");selectExit();//引用选择退出菜单函数
}/********************************
函数名:clockFastsort2
函数功能:降序的快速排序及计时
函数输入参数:数组 数据个数
函数返回值:无
备注:此函数的建立是由于递归的特性
**********************************/
void clockFastsort2(int left,int right,int *a){system("cls");//清除屏幕上显示的信息printf("原始数据:\n");//输出原始数据for(i=0;i<N;i++) printf("%d  ",a[i]);printf("\n\n");Sleep(speed);start=clock();//开始计时b=0;//避免因重复调用b而导致后续输出错误 fastSort2(0,N-1,a);//引用降序快速排序函数 stop=clock();//结束计时  duration=(double)(stop-start)/CLK_TCK;printf("本次排序共耗时: %.0f(秒)\n\n",duration);system("pause");selectExit();//引用选择退出菜单函数
}/********************************
函数名:blnsertsort1
函数功能:进行升序的插入排序
函数输入参数:数组 数据个数
函数返回值: 无
**********************************/
void blnsertsort1(int *a,int N){system("cls");//清除屏幕上显示的信息printf("原始数据:\n");//输出原始数据for(b=0;b<N;b++) printf("%d  ",a[b]);printf("\n\n");Sleep(speed);start=clock();//开始计时 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; if (kbhit()) system("pause");//检测是否按键来暂停/继续printf("第%d步:\n",cnn);//输出每一步的不重复过程for(k=0;k<N;k++){printf("%d  ",a[k]);}printf("\n\n");Sleep(speed);}}            stop=clock();//结束计时 duration=(double)(stop-start)/CLK_TCK;printf("本次排序共耗时: %.0f(秒)\n\n",duration);system("pause");selectExit();//引用选择退出菜单函数
}/********************************
函数名:blnsertsort2
函数功能:进行降序的插入排序
函数输入参数:数组 数据个数
函数返回值: 无
**********************************/
void blnsertsort2(int *a,int N){system("cls");//清除屏幕上显示的信息    printf("原始数据:\n");//输出原始数据for(b=0;b<N;b++) printf("%d  ",a[b]);printf("\n\n");Sleep(speed);start=clock();//开始计时 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; if (kbhit()) system("pause");//检测是否按键来暂停/继续 printf("第%d步:\n",cnn);//输出每一步的不重复过程for(k=0;k<N;k++){printf("%d  ",a[k]);}printf("\n\n");Sleep(speed);}}            stop=clock();//结束计时 duration=(double)(stop-start)/CLK_TCK;printf("本次排序共耗时: %.0f(秒)\n\n",duration);system("pause");selectExit();//引用选择退出菜单函数
}/********************************
函数名:merge1
函数功能:对数据进行升序归并处理
函数输入参数:数组 特定相关参数
函数返回值:无
**********************************/
void merge1(int *a, int L, int M, int R){int i,k;int left[M],right[M];//设一个中间数组int *temp=(int *)malloc((R-L+1)*sizeof(int));int ll=L;int lh=M;int rl=M+1;int rh=R;for(k=0;ll<=lh&&rl<=rh;k++){//将左右两个数组进行比较,将小的交换到左边if(a[ll]<=a[rl]){ temp[k]=a[ll++];}else{temp[k]=a[rl++];}}//将左边未分完的元素加到中间数组末尾if(ll<=lh){for(i=ll;i<=lh;i++)temp[k++]=a[i];} //将右边未分完的元素加到中间数组末尾if(rl<=rh){for(i=rl;i<=rh;i++)temp[k++] = a[i];}//将中间数组的值代入原数组for(i=0;i<R-L+1;i++)a[L+i] = temp[i];free(temp);p++;Sleep(speed);if (kbhit()) system("pause");//检测是否按键来暂停/继续 printf("第%d步:\n",p); for(i=0;i<=R;i++){printf("%d  ",a[i]);}printf("\n\n");return;
}/********************************
函数名:merge2
函数功能:对数据进行降序归并处理
函数输入参数:数组 特定相关参数
函数返回值:无
**********************************/
void merge2(int *a, int L, int M, int R){int i,k;int left[M],right[M];//设一个中间数组int *temp=(int *)malloc((R-L+1)*sizeof(int));int ll=L;int lh=M;int rl=M+1;int rh=R;for(k=0;ll<=lh&&rl<=rh;k++){//将左右两个数组进行比较,将大的交换到左边if(a[ll]>=a[rl]){ temp[k]=a[ll++];}else{temp[k]=a[rl++];}}//将左边未分完的元素加到中间数组末尾if(ll<=lh){for(i=ll;i<=lh;i++)temp[k++]=a[i];}//将右边未分完的元素加到中间数组末尾if(rl<=rh){for(i=rl;i<=rh;i++)temp[k++] = a[i];}//将中间数组的值代入原数组for(i=0;i<R-L+1;i++)a[L+i] = temp[i];free(temp);p++;Sleep(speed);if (kbhit()) system("pause");//检测是否按键来暂停/继续 printf("第%d步:\n",p); for(i=0;i<=R;i++){printf("%d  ",a[i]);}printf("\n\n");return;
}/********************************
函数名:mergeSort1
函数功能:升序的归并排序
函数输入参数:数组 特定相关参数
函数返回值:无
**********************************/
void mergeSort1(int *a, int L, int R){int M=0;if(L<R){M=(L+R)/2;//取中间值M,将数组划分为两半mergeSort1(a,L,M);//左右分别重复上述步骤mergeSort1(a,M+1,R);merge1(a,L,M,R);}return ;
}/********************************
函数名:mergeSort2
函数功能:降序的归并排序
函数输入参数:数组 特定相关参数
函数返回值:无
**********************************/
void mergeSort2(int *a, int L, int R){int M=0;if(L<R){M=(L+R)/2;//取中间值M,将数组划分为两半mergeSort2(a,L,M);//左右分别重复上述步骤mergeSort2(a,M+1,R);merge2(a,L,M,R);}return ;
}/********************************
函数名:clockMergesort1
函数功能:升序的归并排序及计时
函数输入参数:数组 特定相关参数
函数返回值:无
备注:此函数的建立是由于递归的特性
**********************************/
void clockMergesort1(int *a, int L, int R){system("cls");//清除屏幕上显示的信息printf("原始数据:\n");//输出原始数据for(i=0;i<N;i++) printf("%d  ",a[i]);printf("\n\n");Sleep(speed);start=clock();//开始计时p=0;//避免因重复调用p而导致后续输出错误R=N-1; mergeSort1(a,L,R);//引用升序归并排序函数 stop=clock();//结束计时 duration=(double)(stop-start)/CLK_TCK;printf("本次排序共耗时: %.3f(秒)\n\n",duration);system("pause");selectExit();//引用选择退出菜单函数
}/********************************
函数名:clockMergesort2
函数功能:降序的归并排序及计时
函数输入参数:数组 特定相关参数
函数返回值:无
备注:此函数的建立是由于递归的特性
**********************************/
void clockMergesort2(int *a, int L, int R){system("cls");//清除屏幕上显示的信息printf("原始数据:\n");//输出原始数据for(i=0;i<N;i++) printf("%d  ",a[i]);printf("\n\n");Sleep(speed);start=clock();//开始计时p=0;//避免因重复调用p而导致后续输出错误 R=N-1; mergeSort2(a,L,R);//引用降序归并排序函数 stop=clock();//结束计时 duration=(double)(stop-start)/CLK_TCK;printf("本次排序共耗时: %.3f(秒)\n\n",duration);system("pause");selectExit();//引用选择退出菜单函数
}/********************************
函数名:selectExit
函数功能:显示选择退出菜单
函数输入参数:无
函数返回值:无
**********************************/
void selectExit(){system("cls");//清除屏幕上显示的信息 printf("\n");printf("        ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("        ┃         返回方式选择菜单        ┃\n"); printf("        ┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n");printf("        ┃            1.退出程序           ┃\n");printf("        ┃            2.回主菜单           ┃\n");   printf("        ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n\n");printf("\n          请按下相应数字键并回车完成操作\n");c=getchar( );    fflush(stdin);//清空输入缓冲区handleSelectExit(c);//引用处理选择退出菜单的函数
}   /********************************
函数名:handleSelectExit
函数功能:处理选择退出菜单
函数输入参数:字符
函数返回值:无
**********************************/
void handleSelectExit(char c){switch(c)
{case '1':toExit();break;//退出程序 case '2':main();break;//回到主菜单 default:printf("您的输入有误!请重试:\n");c=getchar( );fflush(stdin);handleSelectAlg1(c);//递归式容错性处理 }
}/********************************
函数名:toExit
函数功能:退出程序
函数输入参数:无
函数返回值:无
**********************************/
void toExit(){exit(0); //退出程序
}
本项目采用的技术并不复杂,由于C语言是一门面向过程的语言,我组着重对构成程序的模块进行了开发,并未调用C++的图形函数库,例如菜单的设计和界面的显示,本程序采用了字符界面来表现,但从用户满意度方面考虑,应运用计算机图形学方面的知识来对程序界面进行美化,或是使用Windows Api函数进行窗口样式的程序设计。
从功能角度来看,此程序仍然含有可以优化的部分:
a.用户输入的数据个数超出了用户所预先定下的个数
b.用户在输入所要排序的数据时输入了非法字符
希望有余力的小伙伴帮忙解决啦靴靴!(好烦为什么csdn不可以一次性贴图片 懒得一张一张贴了 视频也传不了 大家control c v一下 跑一跑就完事了)
(转载注明出处喔 love u)

基于C语言实现的多种可视化排序算法演示程序相关推荐

  1. 我们一起来排序——使用Java语言优雅地实现常用排序算法

    破阵子·春景 燕子来时新社,梨花落后清明. 池上碧苔三四点,叶底黄鹂一两声.日长飞絮轻. 巧笑同桌伙伴,上学径里逢迎. 疑怪昨宵春梦好,元是今朝Offer拿.笑从双脸生. 排序算法--最基础的算法,互 ...

  2. C语言中的几种排序算法

    C语言中的几种排序算法 在编程练习时,我们经常会遇到一些将一串乱序的数字排列成有序的数列(递增,递减)的问题,以此起到解决问题的效果.目前我使用的比较熟练的有三种排序算法,冒泡排序法,快速排序法,另外 ...

  3. 水文分析提取河网_基于图的河网段地理信息分析排序算法

    水文分析提取河网 The topic of this article is the application of information technologies in environmental s ...

  4. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  5. c 语言从大到小排序算法,10 大经典排序算法(动图演示+ C 语言代码)

    原标题:10 大经典排序算法(动图演示+ C 语言代码) 来源:C语言与CPP编程 以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. ...

  6. 基于PHP语言ThinkPhp6+Layui数据可视化平台

    项目介绍 一款 PHP 语言基于 ThinkPhp6.x.Layui.MySQL等框架精心打造的一款模块化.插件化.高性能的前后端分离架构敏捷开发框架,可用于快速搭建前后端分离后台管理系统,本着简化开 ...

  7. c语言选择排序步骤,C语言中如何实现选择排序算法

    选择排序法实现的步骤:首先找出一个最小数交换到最前面:然后在剩下的数中找个最小的交换到剩下数最前面:最后一直重复此步骤,直到所有数排好即可. 选择排序法实现的步骤:找出一个最小数交换到最前面,然后在剩 ...

  8. C语言实现十大经典排序算法

    冒泡排序 void bubbleSort(int a[],int n){int i,j,temp;for(i=0;i<n-1;i++){for(j=0;j<n-i-1;j++){if(a[ ...

  9. 桶排序算法c语言10个数组,桶排序算法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //2.21 桶排序 #include #include #define SIZE 100 void bucket_sort(unsigned *,int ...

最新文章

  1. linux常用SHELL
  2. 研究生的研究人员发展课程
  3. springboot读取自定义properties文件
  4. MySQL常用存储引擎之Innodb
  5. SAP Marketing Cloud功能简述(一)Contacts和Profiles
  6. c#url拼接方法名_c# 获取url参数的五种方法
  7. echarts图表自适应
  8. 风控上模型中的大小卡、主路旁路的应用
  9. 没有月亮的中秋,有CCNP伴我度过!
  10. Robocode学习Java
  11. 银行管理系统(简单概述)
  12. Mac OS X新手入门
  13. matlab 线性拟合(好像也可以由两点得出直线)
  14. 2018校招 多益网络 人工智能及大数据研发工程师 面经
  15. 计算机控制系统总线,计算机控制系统功能之现场总线控制-电脑自学网
  16. PHP 魔术常量,__LINE__,__FILE__,__DIR__等等8个常用魔术常量
  17. 无线路由器经常掉线断网的可能的原因
  18. iphone不显示wifi连接到服务器,iPhone出现无法连接到任何WiFi怎么办 WiFi故障解决方法...
  19. mysqlclient==1.3.7对应mysql版本_MySQL 5.7.30 的安装/升级(所有可能的坑都在这里)...
  20. 当面试官问Webpack的时候他想知道什么

热门文章

  1. Solidity基础教程2——Safemath
  2. 视频教程-PHP基础项目实战/过程化开发-PHP
  3. [王鼎杰] 法国为什么是五常之一
  4. Driller工具分析
  5. Driller分析与改进(一)
  6. OOP上半部分-Java与生活
  7. CC00027.hadoop——|HadoopHive.V27|——|Hive.v27|Hive优化策略|实战.v03|
  8. 什么是SpringMVC?SpringMVC之hello.jsp实现过程 问题:SpringMVC在JSP页面取不到ModelAndView中的值(已解决)
  9. jquery循环获取div之间的内容
  10. 【FPGA】Quartus Prime 20.1 精简版下载安装教程记录