一边学算法,一边学c语言之冒泡排序
概要
在编程中,我们可能会用到各种各样的算法,其中有些问题的对应的算法有好几种,所以我们要分析一个算法的优劣性,选择合适的算法。
冒泡算法分析
基于上述目的,我们需要学会算法分析这门技术,来衡量算法性能,以冒泡算法为例:
冒泡算法:“大数下沉,小数上冒”
伪代码描述如下(《算法分析与设计》):
1 BUBBLE-SORT(A) 2 for i <- 1 to length[A] 3 do for j <- lenght[A] downto i+1 4 do if A[j]<A[j-1] 5 then exchange A[j] <->A[j-1]
我们给上面的代码加上每行的代码时间开销和执行次数,其中设length[A]=n,第四行的执行次数为:
1 BUBBLE-SORT(A) 开销 2 for i <- 1 to length[A] c1 3 do for j <- lenght[A] downto i+1 c1 4 do if A[j]<A[j-1] c2 5 then exchange A[j] <->A[j-1] c3
第一行的执行次数为:
n+1
第二行的执行次数为(\sum_{i=1}^{n}(n-i+1)):
第三行的执行次数为(\sum_{i=1}^{n}(n-i)):
那么该算法的总运行时间为,每条语句的开销X语句的执行次数之和:
算法的最佳情况:
最坏的情况:
,
这时可以写成
增长的数量级:
当n很大时,低阶项可以忽略,公式可以简化为:
最坏的情况下数量级为:
的算法会比
的算法运行的快
开始我是这么写的:
1 #include <stdio.h> 2 3 4 void bubble_sort(int a[],int n); 5 6 void main() 7 { 8 int a[]={12,3,6,34,4,-44,2,10,44}; 9 bubble_sort(a); 10 for (int i=0;i<n;i++) 11 printf(" %d ",a[i]); 12 printf("\n"); 13 } 14 15 void bubble_sort(int a[]) 16 { 17 int n=sizeof(a)/sizeof(int); 18 for (int i=0;i<n;i++) 19 { 20 for (int j=n-1;j>=i+1;j--) 21 { 22 if (a[j] < a[j-1]) 23 { 24 int temp=a[j]; 25 a[j]=a[j-1]; 26 a[j-1]=temp; 27 } 28 } 29 } 30 }
然后发现了错误,是因为函数参数传递的参数只是一个指针,不能计算数组的大小,于是这么写的:
#include <stdio.h> void bubble_sort(int a[],int n); void main() { int a[]={12,3,6,34,4,-44,2,10,44}; int n=sizeof(a)/sizeof(int); bubble_sort(a,n); for (int i=0;i<n;i++) printf(" %d ",a[i]); printf("\n"); } void bubble_sort(int a[],int n) { //int n=sizeof(a)/sizeof(int); for (int i=0;i<n;i++) { for (int j=n-1;j>=i+1;j--) { if (a[j] < a[j-1]) { int temp=a[j]; a[j]=a[j-1]; a[j-1]=temp; } } } }
总结:
算法分析需要的是每句代码的时间开销和执行次数,在数据很大的时候可以忽略低阶项,我们一般在乎最坏时间复杂度。
c语言函数的参数传递的数组形参只是一个地址