高手帮帮我啊。关于排序问题的!

在下面代码的基础上进行改进。要求:
(1)编程实现三个不同类型的排序算法;
(2)在每个算法程序中记录开始时间和结束时间,并计算差值作为每个算法运行时间;
(3)编制一个产生随机数序列的程序;
(4)生成不同长度的随机整数序列并让不同的算法程序进行排序,记录下每个算法程序运行的时间;
(5)在二维坐标平面上用不同的颜色(三种)描述出各种算法在不同问题规模下运行的时间点(横轴为问题规模,纵轴为运行时间),然后用光滑的曲线把颜色的点连接起来;
(6)对曲线进行分析。
#include <stdio.h>
#include <stdlib.h>
#define M 11
void InsertSort(int a[])//插入排序
{
int i,j;
for(i=2;i <=M;i++)
{
if(a[i] <a[i-1])
{
a[0]=a[i];
a[i]=a[i-1];
for(j=i-2;j>0&&a[i]>a[0];j--)
a[j+1]=a[j];
a[j+1]=a[0];
}
}
printf("进行插入排序:");
for(i=1;i <M;i++)
printf("%4d",a[i]);
printf("/n");
}
void BinarySort(int a[])//折半查找
{
int i,j,m,low,high;
for(i=2;i <M;i++)
{
a[0]=a[i];
low=1;
high=i-1;
while(low <=high)
{
m=(low+high)/2;
if(a[0]>a[m])
low=m+1;
else
high=m-1;
}
for(j=i-1;j>high;j--)
a[j+1]=a[j];
a[j+1]=a[0];
}
printf("进行折半排序:");
for(i=1;i <M;i++)
printf("%4d",a[i]);
printf("/n");
}
void Bubble(int a[])//冒泡排序
{
int i,j,temp;
int flag=1;
for(i=1;i <=10;i++)
{
flag=0;
for(j=i+1;j <=10;j++)
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
flag=1;
}
}
}
printf("进行起泡排序:");
for(i=1;i <=10;i++)
printf("%4d",a[i]);
printf("/n");
}
void HeapSort(int a[])//堆排序
{
int i;
int HeapAdjust(int a[],int i,int n);
for(i=(M-1)/2;i>0;i--)
HeapAdjust(a,i,M-1);
for(i=M-1;i>0;)
{
a[0]=a[i];
a[i]=a[1];
a[1]=a[0];
i--;
HeapAdjust(a,1,i);
}
printf("进行堆排序:");
for(i=1;i <M;i++)
printf("%4d",a[i]);
printf("/n");
}

int HeapAdjust(int a[],int i,int n)
{
int j,k;
int flag=1;
j=2*i;
k=a[i];
while (j <=n&&flag==1)
{
if (j <n&&a[j] <a[j+1])
j++;
        if (k>=a[j])
flag=0;
else
{
a[j/2]=a[j];
j*=2;
}
}
a[j/2]=k;
return 0;
}

void ShellSort(int a[])//希尔排序
{
int k,i,j,temp;
k=M-1/2;
for(;k>0;k--)
{
j=i-k;
while (j>0)
{
if (a[j]>a[i])
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
j=j-k;
}
}
printf("进行希尔排序:");
for (i=1;i <M;i++)
{
printf("%4d",a[i]);
printf("/n");
}
}
void MergeSort(int a[],int b[])//归并排序
{
int i=1,j=1,k=0;
int n,c[30];
Bubble(a);
Bubble(b);
while (i <M&&j <M)//这里循环语句要写清楚 一个if对应一个else 否则编译器会出错
{
if (a[i] <b[j])
c[k++]=a[i++];
else if (a[i]>b[j])
c[k++]=b[j++];
else c[k++]=a[i++];
}
while (i <M)
c[k++]=a[i++];
while (j <M)
c[k++]=b[j++];
n=k;
printf("进行归并排序:");
for (i=0;i <n;i++)
printf("%4d",c[i]);
printf("/n");
}
int main(void)
{
int a[M]={0,9,8,7,6,5,4,3,2,1,0};
int b[M]={0,3,11,34,13,10,19,15,14,16,18};
int select,i;
for (i=1;i <M;i++)
printf("%4d",a[i]);
printf("/n");
printf("1:进行插入排序/n");
printf("2:进行折半排序/n");
printf("3:进行冒泡排序/n");
printf("4:进行堆排序/n");
printf("5:进行希尔排序/n");
printf("6:进行归并排序/n");
printf("请选择:");
scanf("%d",&select);
switch(select)
{
case 1: InsertSort(a);break;
case 2: BinarySort(a);break;
case 3: Bubble(a);break;
case 4: HeapSort(a);break;
case 5: ShellSort(a);break;
case 6: MergeSort(a,b);break;
default: break;
}
system("pause");
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值