网站大量收购闲置独家精品文档,联系QQ:2885784924

A-算法分析实验指导提纲【荐】.doc

  1. 1、本文档共61页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
A-算法分析实验指导提纲【荐】.doc

算 法 分 析 实 验 指 导 提 纲 余波 实验一、归并排序及各种排序算法性能比较 上机实验的问题和要求: 了解各种排序算法,并能独立在计算机上实现,同时并能够计算它们的时间复杂度,并用计算机来验证. 二.程序设计的基本思想,原理和算法描述: (1)选择排序法:每次选择一个当前最小的并和当前的相对的第一个元素交 换,直到最后只有一个元素时结束; (2)插入排序法:从第二个元素开始,每次插入一个到当前有序序列中,使 得有序,当所有的元素插入完毕时,就排好序了; (3)快速排序法:每次选择一个中间元素,并进行交换,使得中间元素的左 边比它小,右边比它大,然后对左右两边进行递归; (4)堆排序:采用插入的模式产生堆,然后把根交换到最后,在形成一个堆, 在吧根与当前最后一个交换,如此,直到最后只剩下一个元素; (5)归并排序:将序列每次分成两组,在进行合并,直到递归完成; 三、源程序及注释: (1)选择排序: //算法的精髓:每趟比较选择一个最小的并交换 void fun(int *a,int n) { int temp, min; int i,j; for(i = 0 ; i n-1 ; i++) { min = i; for( j = i+1 ; j n ; j++) { if(a[j] a[min]) min = j; //min指示每趟最小值的下标 } temp = a[min]; a[min] = a[i]; a[i] = temp; } } (2)插入排序: //算法的精髓:将a[i]依次插入到前面已经排序的数组中 void fun(int *a,int n) { int I,j,val; for(i = 1 ; i n ; i++) { val = a[i]; //将a[i]依次插入 j = i-1; while((val a[j]) (j = 0)) { a[j+1] = a[j]; //每次后移一次 j--; } a[j+1] = val; } } (3)快速排序: //快速排序 void quicksort(int *a,int i,int j) { if(i j) { int p = partion(a,i,j); //得到合适位置 quicksort(a,i,p-1); //左边进行排序 quicksort(a,p+1,j); //右边进行排序 } } //分区 把a[l]放在正确的位置 int partion(int *a,int l,int r) { int i = l; int j = r+1; int temp; int v = a[l]; for(;;) { while(a[++i]v); //从左边找到第一个比v大的 while(a[--j]v) //从右边找到第一个比v小的 if(j == l) break; if(i = j) break; temp = a[i]; //交换 a[i] = a[j]; a[j] = temp; } temp = a[j]; //a[l] 与正确位置的数交换 a[j] = a[l]; a[l] = temp; return j; //j为正确位置 } (4)堆排序: //参数:数组和个数 插入法的思想 //功能:数组的a[0]...a[n-2]是堆,当进行操作以后a[0]...a[n-1]是堆 void heapfy(int *a,int n) { int temp; int h = n-1; while(h 0) //h = 0 时说明其已经是根节点,结束 { if(a[h] a[(h-1)/2]) //当前结点大于其父节点 { temp = a[h]; a[h] = a[(h-1)/2]; a[(h-1)/2] = temp; h = (h-1)/2; } else break; } } //输入:数组,和元素个数,a[0]的两个子树为堆 //功能:使a[0]...a[n-1]为堆 void shiftdown(int *a,int n) { int h = 0; int temp; while(2*h+2 n) { if((a[h] a[2*h+1]) (a[h] a[2*h+2])) //a[h]为父节点 break; else if(a[2*h+1] a[2*h+2])

文档评论(0)

cnsg + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档