/***bubble.c 冒泡排序 */
#include<graphics.h>
#include<dos.h>
#define N 10/*定义排序数据为10个*/
#include <math.h>
#include
<time.h>/*显示程序运行时间*/
#include <stdlib.h>
void Init (int a[]);/*初始状态*/
void Close (void);/*图形模式结束*/
void Pr(int a[], int n);/*输出数组*/
void DrawChange(int i,int j);/*画交换箭头*/
void Bubble_sort(int a[],int n);/*冒泡排序*/
void main (void)/*主函数*/
{
int i,a[N],q,z;
printf("0 = random\n");/*按0随机产生10个数*/
printf("1 =enter number\n");/*按1键入10个数*/
scanf("%d",&q);
printf("0 = ascending\n");/*按0升序*/
printf("1 =descending\n");/*按1降序*/
scanf("%d",&z);
if((q<0)|(q>1))/*判断随机产生数或用户键入*/
{
printf("error!then num id outside.\n");/*输出错误*/
}
else
{
if(q<=0)/*随机产生10个数*/
{
printf("%d\t",rand());/*产生随机数*/
Init(a);
Bubble_sort(a,10);
Close();
exit(0);
}
else/*用户键入10个数*/
{
int i,a[N];
printf("please enter 10 int number\n");/*输出
10个整数*/
for (i=0;i<N;i++)
scanf("%d",&a[i]);
Init(a);
Bubble_sort(a,10);/*具体排序*/
Close();/*图形模式结束*/
exit(0);
}
}
}
/*初始*/
void Init (int a[])
{
int gd=DETECT,gm,i;
initgraph(&gd,&gm,"");/*初始化图形系统*/
cleardevice();/*清屏*/
setcolor(YELLOW);/*设置颜色*/
outtextxy(210,10,"any key to continue");/*主界面输出的字符
串*/
Pr(a,40);/*第一次输出数组*/
getch();/*等待按任意键*/
}
void Close (void)/*图形模式结束*/
{
getch();/*等待按任意键*/
closegraph();/*关闭图形模式*/
}
void Pr(int a[],int n)/*输出数组*/
{
int i;
char num[5];
settextstyle(1,0,2);/*设置输出样式*/
setcolor(GREEN);/*设置输出颜色*/
for(i=100;i<600;i+=50)/*i控制显示位置和计算数组*/
{
sprintf(num,"%d",a[(i-100)/50]);/*将数值转化成
字符串*/
outtextxy(i,n,num);/*输出字符串*/
}
}
/*画交换箭头,画五根线组成一双向箭头线*/
void DrawChange(int i,int j)
{
setcolor(6);
line(j*50+135,i+8,j*50+130,i+4);/*按给出的坐标位置画直
线*/
line(j*50+135,i+4,j*50+135+1,i+2);
line(j*50+135,i+4,j*50+135+1,i+6);
line(j*50+145,i+4,j*50+145-1,i+2);
line(j*50+145,i+4,j*50+13450-1,i+6);
}
/*冒泡排序*/
void Bubble_sort(int a[], int n)
{
int i,j,t,flag,m,x,z;
char num1[5], num2[5];
m=0;
x=0;
for(i=0;i<n-1;i++)/*冒泡排序*/
{
x=x+1;
flag=0;/*设置数据交换标志*/
for(j=0;j<n-1-i;j++)
{
Pr(a,i*40+80);/*输出数*/
setcolor(BLUE);/*输出两个要比较的数
*/
sprintf(num1,"%d",a[j]);/*将两个数转换
成字符串输出*/
outtextxy(100+j*50,i*40+80,num1);
sprintf(num2,"%d",a[j+1]);
outtextxy(100+(j+1)*50,i*40+80,num2);
sleep(1);/*暂停运行一秒*/
if(z=0)
{
if(a[j]>a[j+1])
{
m=m+1;
flag=1;/*置交换标志*/
DrawChange(i*40+80,j);/*画
交换箭头*/
setcolor(RED);
outtextxy
(100+j*50,i*40+80,num1);
outtextxy(100+(j+1)
*50,i*40+80,num2);
t=a[j];/*交换*/
a[j]=a[j+1];
a[j+1]=t;
sleep(1);
setfillstyle
(SOLID_FILL,BLACK);/*黑矩形的方式删除行*/
bar
(0,i*40+60,640,i*40+100);
}
}
else
{
if(a[j]<a[j+1])
{
m=m+1;
flag=1;/*置交换标志*/
DrawChange(i*40+80,j);/*画
交换箭头*/
setcolor(RED);
outtextxy
(100+j*50,i*40+80,num1);
outtextxy(100+(j+1)
*50,i*40+80,num2);
t=a[j];/*交换*/
a[j]=a[j+1];
a[j+1]=t;
sleep(1);
setfillstyle
(SOLID_FILL,BLACK);/*黑矩形的方式删除行*/
bar
(0,i*40+60,640,i*40+100);
}
}
}
Pr(a,i*40+80);
sleep(1);
if(flag==0) break;/*如果本次比较没有发生交换则
跳出循环*/
}
printf("degree=%d\n",m);
printf("ranks=%d\n",x);
}