实验一:冒泡排序不同问题实例下的时间复杂度分析与检验
1.实验目的
实现冒泡排序,比较冒泡排序在不同输入实例下的复杂度。
2.实验内容
请修改和实现该算法,加入比较次数的计算与结果输出,并分别以 n=20 的三 组数据作为输入(最好情况、一般情况、最坏情况),输出排序结果,并输出比较次数,分析比较次数与不同情况输入以及问题规模 N 的关系
3.设计思路
算法思想: 依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。
1)第一次比较,首先比较第一和第二个数,将小数放在前面,将大数放在后面。
2)比较第2和第3个数,将小数 放在前面,大数放在后面。
3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成。
4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。
5)在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。
6)依次类推,每一趟比较次数减少依次。
4.关键代码
#include <stdio.h>
const int N=25;
int main()
{
int n,done,a[N];
int t=3;
scanf("%d",&n);
while(t--)
{ done=0;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n-1;i++)
for(int j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
done++;
}
}
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("比较次数:%d",done);
}
return 0;
}
5.运行结果
6.实验总结(含心得体会)
利用冒泡排序对20个数进行排序时,最好的情况即为顺序,比较次数最少,最坏的情况为倒序,比较的次数最多;问题规模N越大,比较次数越多。