- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
例2. 把数组中n个元素由小到大排序. 算法2. 冒泡算法 输入: 数组A[], 元素个数n 输出: 按递增排序的数组A[] 1. void bubble(Type A[],int n) 2. {int i,k; 3. for (k=n-1;k0;k--) { 4. for (i=0;ik;i++) { 5. if (A[i]A[i+1]){swap(A[i],A[i+1]);}}}} 6. void swap(Type x,Type y) 7. {Type temp; temp=x; x=y; y=temp; } 外部for循环体共执行n-1次: 第1次, 内部for循环体执行n-1次; 第2次, 内部for循环体执行n-2次;… 总的循环次数为: (n-1)+(n-2)+…+1 = n(n-1)/2 令c1表示循环体的平均执行时间, c2表示辅助操作的执行时间, 算法的总执行时间T(n)为: T(n) = n(n-1)/2?c1+c2 = ?(n2) 例3. 选手的竞技淘汰比赛 有2k位选手进行淘汰赛, 最后决出冠军. 用函数Bool comp(Type m1,Type m2) 模拟两位选手的比赛, 若m1胜则返回true, 否则返回false。 假定函数comp可在常数时间内完成。 算法3. 竞技淘汰比赛 输入: 选手成员group[], 选手个数n 输出: 冠军选手 1. Type game(Type group[], int n) 2. {int j, i=n; 3. while (i1) { i=i/2; 4. for (j=0; ji; j++) 5. if (comp(group[j+i], group[j]) 6. group[j] = group[j+i]; } 7. return group[0]; } 因为 n=2k, while循环体共执行k次: 第1次, for循环体执行n/2次; 第2次, for循环体执行n/4次; … 算法的执行时间T(n)为: T(n) = n/2 + n/4 +…+ n/n = n(1/2 +1/4 +…+ 1/2k) = n(1?1/2k) = n?1 = ?(n) 选取算法中一个初等操作作为基本操作, 估计它在算法中的执行频率, 以此来估计算法的时间复杂性。 定义1.8 若算法中某个初等操作的最高执行频率和所有其它初等操作的最高执行频率相差在一个常数因子之内, 则称该初等操作为基本操作。 如比较、赋值、算术运算等。基本操作的选取必须能明显反映该操作随输入规模的增加而变化的情况。 1.3.2 基本操作频率的统计 例4. 合并两个有序子数组 假定A是m个元素的整数数组, 其中A[p]~A[q]和A[q+1]~A[r]已递增排序, 0?p?q?rm。把这两个子数组按递增顺序合并在A[p]~A[r]中。 算法4. 合并两个有序子数组 输入: 数组A[ ], 下标p,q,r, 元素个数m 输出: 递增排序的数组A[p]~A[r] 1. void merge(int A[],int p,int q,int r,int m) 2. int i,j,k; int B[]; i=p; j=q+1; k=0; 3. while (i=q j=r) { 4. if (A[i]=A[j]) B[k++]=A[i++]; 5. else B[k++]=A[j++]; } 6. if (i==q+1) /*处理余下元素 */ 7. for (; j=r; j++) B[k++]=A[j++]; 8. else for(; i=q; i++) B[k++]=A[i++]; 9. k=0; 10. for (i=p; i=r; i++) A[i++]=B[k++]; 11. delete B; } while循环次数、for循环次数不确定。 基本操作的选择: 1. 选赋值操作为基本操作, 操作频率2n 1) 随输入规模的增大而增加; 2) 频率与其它操作频率相差一数因子; 算法的时间复杂性为?(n)。 2. 选比较操作为基本操作: 令子数组大小为n1和n2, n1+n2=n, 比较次数最少min{n1, n2}, 最多n-1, 算法的时间复杂性仍为?(n)。 上述两种方法忽略了其它操作的开销。计算步则统计算法中
文档评论(0)