实验目的:
- 掌握选择排序、冒泡排序、合并排序、快速排序、归并排序的算法原理
分析不同排序算法的时间效率和时间复杂度,以及理论值与实测数据的对比分析。
一、冒泡排序
算法伪代码:
for i=1 to n
for j=0 to n-i
if ( data[j]>=data[j+1])
swap(data[j],data[j+1])
算法思路:
第一个循环表示n-1趟即可完成排序。每一趟将最大的数调换位置到未排序数字的末尾。
数据分析:
由图1.冒泡排序的曲线图可以看出冒泡排序的时间增长基本符合二次增长,先选取以n=10000的实际时间t1作为理论时间的基准。
当n=20000时,t2=t1*(2/1)2、
当n=30000时,t3=t1*(3/1)2,以此类推做出表1。
数据规模 |
10000 |
20000 |
30000 |
40000 |
50000 |
实际时间(ms) |
171.1 |
669.75 |
1513.8 |
2580.85 |
3956.85 |
理论时间 (ms) |
171 |
684 |
1539 |
2736 |
4275 |
表1.10000为基准
图1.冒泡排序
由图一可得,以n=10000为基准时,n=50000时理论和实际有一些偏差。怀疑是n=10000的实测时间可能是高于平均时长,所以我又以n=50000为基准做出下表。
数据规模 |
10000 |
20000 |
30000 |
40000 |
50000 |
实际时间(ms) |
171.1 |
669.75 |
1513.8 |
2580.85 |
3956.85 |
理论时间 (ms) |
158.274 |
633.096 |
1424.466 |
2532.384 |
3956.85 |
表2.以n=50000为基准
两条曲线基本拟合,说明当n=10000时所测得的实际时间比平均时间略长一点,所以导致后面的理论值偏大。
时间复杂度分析:
冒泡排序最好情况:数据本来已是正序,仅需要进行n-1次比较操作即可,时间复杂度为O(n)
冒泡排序