文档库 最新最全的文档下载
当前位置:文档库 › 排序大作业

排序大作业

#include
#include //用于system("cls")清屏,sleep函数,随机数
#include
#include//随机数
#define N 6
void show(int j,int a)//显示数组
{
if(a<10)
printf(" [%d]: %d:",j+1,a);
else
printf(" [%d]:%d:",j+1,a);//a[j],a代表大小
for(int n=0;n{
printf("-");//当未进行比较或者交换时显示
}
printf("\n");
}
void comparingi(int j,int a)//i正在比较
{
printf("i->");//当正在进行比较时显示j->a[i]:6******
if(a<10)
printf("[%d]: %d:",j+1,a);
else
printf("[%d]:%d:",j+1,a);
for(int i=0;i{
printf("*");
}
printf("\n");
}
void comparingj(int j,int a)//j正在比较
{
printf("j->");//当正在进行比较时显示j->a[i]:6******
if(a<10)
printf("[%d]: %d:",j+1,a);
else
printf("[%d]:%d:",j+1,a);
for(int i=0;i{
printf("*");
}
printf("\n");
}
void swapingi(int j,int a)//正在交换
{
printf("i->");//当正在进行交换时显示j->a[i]:6++++++
if(a<10)
printf("[%d]: %d:",j+1,a);
else
printf("[%d]:%d:",j+1,a);
for(int i=0;i{
printf("+");
}
printf("\n");
}
void swapingj(int j,int a)//正在交换
{
printf("j->");//当正在进行交换时显示j->a[i]:6++++++
if(a<10)
printf("[%d]: %d:",j+1,a);
else
printf("[%d]:%d:",j+1,a);
for(int i=0;i{
printf("+");
}
printf("\n");
}
int menu();
int bubble(int a[N])//冒泡法
{
int i,j,temp,flag,countc=0,counts=0;//countc为比较次数,counts为交换次数
for(i=1;i{
flag=0;
for(j=0;j{
printf(" comparing times:%d swaping times:%d\n",countc,counts);//正在比较
printf("正在比较。。。\n");
for(int x=0;x{
show(x,a[x]);
}
comparingi(j,a[j]);//显示正在比较的
if(j+1comparingj(j+1,a[j+1]);
if(j+2{
for(int y=j+2;y{
show(y,a[y]);
}
}
printf("\n");
_sleep(1000);//控制刷屏的速度,()中的数越小速度越慢
system("cls");//清除屏幕上的所有东西
countc++;//比较次数

if(a[j]>a[j+1])
{
printf(" comparing times:%d swaping times:%d\n",countc,counts);//交换
printf("正在交换。。。\n");
for(int p=0;p{
show(p,a[p]);
}
swapingi(j,a[j]);//正在交换的数
if(j+1swapingj(j+1,a[j+1]);
if(j+2{
for(int q=j+2;q{
show(q,a[q]);
}
}
printf("\n");
_sleep(1000);
system("cls");
temp=a[j];//进行交换
a[j]=a[j+1];
a[j+1]=temp;
flag=1;
counts++;//交换次数
}
}
if(flag==0)
break;
}

printf("冒泡法排序后数据为: \n\n");//输出排序后的数组
printf(" comparing

times:%d swaping times:%d\n\n",countc,counts);
for(i=0;ishow(i,a[i]);
printf("\n");
printf("即:");
for(i=0;iprintf("%d ",a[i]);
printf("\n");
printf("请选择是否继续:1 代表继续 0 代表退出\n");
int n;
scanf("%d",&n);
if(n==1)
menu();
else
return 0;
return 0;
}
int select(int a[N])//选择法
{
int i,j,min,temp,k,countc=0,counts=0;
for(i=0;i{
min=i;
for(j=i+1;j{
printf(" comparing times:%d swaping times:%d\n",countc,counts);
printf("正在查找最小的数。。。\n");
for(k=0;k{
show(k,a[k]);
}
comparingi(i,a[i]);
if(i+1{
for(k=i+1;k{
if(k==j)
comparingj(k,a[k]);
else
show(k,a[k]);
}
}
_sleep(1000);
system("cls");
countc++;/**/


if(a[min]>a[j])
min=j;
}
if(min!=i)
{
printf(" comparing times:%d swaping times:%d\n",countc,counts);//交换
printf("正在交换。。。\n");
for(k=0;k{
show(k,a[k]);

}
swapingi(i,a[i]);
if(i+1{
for(k=i+1;k{
if(k==min)
swapingj(k,a[k]);
else
show(k,a[k]);
}
}
_sleep(1000);
system("cls");
counts++;

temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
printf("选择法排序后的结果为:\n\n");
printf(" comparing times:%d swaping times:%d\n\n",countc,counts);
for(i=0;ishow(i,a[i]);
printf("\n");
printf("即:");
for(i=0;iprintf("%d ",a[i]);
printf("\n");
printf("请选择是否继续:1 代表继续 0 代表退出\n");
int n;
scanf("%d",&n);
if(n==1)
menu();
else
return 0;
return 0;
}
///////////////////////////////归并
int Merge(int a[],int b[],int left,int m,int right)
{
int i=left,k=left,j=m+1,n;
while(i<=m && j<=right)
{
if(a[i]{
b[k++]=a[i++];
printf("将小的数依次挑出。。。 ");
for(n=0;nprintf("%d ",b[n]);
printf("\n");
_sleep(1000);
}
else
{
b[k++]=a[j++];
printf("将小的数依次挑出。。。 ");
for(n=0;nprintf("%d ",b[n]);
printf("\n");
_sleep(1000);
}
}
if(i>m)//仅剩后半部分的一部分为并入B中
{
while(j<=right)
{
b[k++]=a[j++];
printf("挑出后的结果为: ");
for(n=0;nprintf("%d ",b[n]);
printf("\n");
_sleep(1000);
}
}
else//仅剩前半部分中的一部分未并入B中
{
while(i<=m)
{
b[k++]=a[i++];
printf("挑出后的结果为: ");
for(n=0;nprintf("%d ",b[n]);
printf("\n");
_sleep(1000);
}
}
return 0;
}
int MergeSort(int a[],int b[],int s,int n,int count

)
{
int i=0;
while(i<=n-2*s)
{
Merge(a,b,i,i+s-1,i+2*s-1);
i+=s*2;
}
if(i+s{
Merge(a,b,i,i+s-1,n-1);
}
else//剩余的数字已经不足s
{
while(i{
b[i]=a[i++];
}
}
printf("\n第%d次归并中后结果为:\n",count);
for(int j=0;jprintf("%d ",b[j]);///
printf("\n");///
return 0;
}
int merger(int a[N])//归并
{
int b[N],i,count=1;
i=1;
while(i{
printf("第%d次归并中。。。\n",count);
MergeSort(a,b,i,N,count);//反复归并,排序
i+=i;
_sleep(1000);
system("cls");
count++;
printf("第%d次归并中。。。\n",count);
MergeSort(b,a,i,N,count);
_sleep(1000);
system("cls");
count++;
i+=i;
}
printf("归并排序结果为:\n");
for(i=0;iprintf("%d ",a[i]);
printf("\n");/**/
printf("请选择是否继续:1 代表继续 0 代表退出\n");
int n;
scanf("%d",&n);
if(n==1)
menu();
else
return 0;
return 0;
}/**///////////////////////////////////////
//************************************************************
int quicksort(int a[N],int q)//快速排序
{
int k=0,m=0,n=0,kk=0,j;
int b[N],c[N];
int temp=q;
for(int i=0;i{
if(a[i]{
b[k++]=a[i];
m++;
printf("正在选择不大于标志数的数。。。 ");
for(j=0;jprintf("%d ",b[j]);
printf("\n");
_sleep(1000);
}
else
{
c[kk++]=a[i];
n++;
printf("正在选择不小于标志数的数。。。 ");
for(j=0;jprintf("%d ",c[j]);
printf("\n");
_sleep(1000);
}
}

for(int x=0;x{
a[x]=b[x];
}
a[m]=temp;
for(int y=0;ya[m]=c[y];
return 0;
}
//*****************************************************************
void insert(int a[N],int m,int ij)//插入法排序
{
int place=0,i;
while(place{
if(a[place]>m)
{
break;
}
else
place++;
}
for(i=ij;i>place;i--)
a[i]=a[i-1];
a[place]=m;
printf("插入新元素后数组个元素为:\n");
for(i=0;iprintf("%d ",a[i]);
printf("\n");
}/////////////////
int menu();
int randomnumber(int p)//随机数产生程序,包含在#include和#include
{
int i,a[N];
printf("计算机产生的6个随机数为:\n");
srand((unsigned)time(NULL));
for(i=0;i{
a[i]=rand()%40;//数组a[N]的产生
}
for(i=0;i{
printf("%d ",a[i]);
}
printf("\n");
system("cls");
if(p==1)//p==1选择冒泡
bubble(a);
if(p==2)//p==2选择选择排序法
select(a);
if(p==3)
merger(a);
if(p==4)
{
int count=1;
for(int i=0;i<2;i++)
{
for(int k=0;k

{
quicksort(a,a[k]);
printf("\n第%d次快排结果为: ",count);
for(int p=0;pprintf("%d ",a[p]);
printf("\n");
_sleep(1000);
system("cls");
count++;
}
}
printf("快排排序结果为: ");
for(int j=0;jprintf("%d ",a[j]);
printf("\n");
printf("请选择是否继续:1 代表继续 0 代表退出\n");
int n;
scanf("%d",&n);
if(n==1)
menu();
else
return 0;
}
if(p==5)
{
for(i=0;i{
printf("输入第%d个数后数组为:\n",i+1);
insert(a,a[i],i);
_sleep(1000);
system("cls");
}
printf("最终结果为:\n");
for(i=0;iprintf("%d ",a[i]);
printf("\n");
printf("请选择是否继续:1 代表继续 0 代表退出\n");
int n;
scanf("%d",&n);
if(n==1)
menu();
else
return 0;
}
return 0;
}
int menu()//菜单
{
int p;
printf("1 冒泡排序法\n\n2 选择排序法\n\n3 归并排序法\n\n4 快速排序法\n\n5 插入排序法\n\n请输入您要选择的排序方法(1,2,3,4,5):");
scanf("%d",&p);
randomnumber(p);
return 0;
}
int sortways()//排序方法
{
int m,i,j;
int a[N],b[N],c[N];
system("cls");
printf("1 冒泡排序法\n\n2 选择排序法\n\n3 归并排序法\n\n4 快速排序法\n\n5 插入排序法\n\n请输入您要选择的排序方法(1,2,3,4,5):");
scanf("%d",&m);
system("cls");
if(m==1)
{
printf("冒泡排序法:输入6个待排序数据: \n");
for(j=0;jscanf("%d",&a[j]);
system("cls");
bubble(a);
}
if(m==2)
{
printf("选择排序法:输入6个待排序数据: \n");
for(i=0;iscanf("%d",&b[i]);
system("cls");
select(b);
}
if(m==3)
{
printf("归并排序法:输入6个待排序数据: \n");
for(i=0;iscanf("%d",&c[i]);
system("cls");
merger(c);
}
if(m==4)
{
printf("快速排序法:输入6个待排序数据: \n");
for(i=0;iscanf("%d",&c[i]);
int count=1;
for(int i=0;i<2;i++)
{
for(int k=0;k{
quicksort(c,c[k]);
count++;
printf("\n第%d次排序结果为: ",count);
for(int p=0;pprintf("%d ",c[p]);
printf("\n");
_sleep(1000);
system("cls");
}
}
printf("快排排序结果为: ");
for(int j=0;jprintf("%d ",c[j]);
printf("\n");
}
if(m==5)
{
int m,j=0;
for(int i=0;i{
printf("请输入第%d个数组元素:\n",j+1);
scanf("%d",&m);
j++;
system("cls");
insert(c,m,i);
}
}
return 0;
}
int main()
{
int n;
printf("1 由计算机随机选数\n\n2 由您自己选数\n\n 请输入您的选择(1,2):");//菜单
scanf("%d",&n);
system("c

ls");
if(n==1)
{
menu();
}
if(n==2)
{
sortways();
}
return 0;
}

相关文档