- 1、本文档共61页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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])
您可能关注的文档
- 5团队沟通【荐】.ppt
- 5电子商务【荐】.pdf
- 5算法分析与设计 第五讲 分治法及相关实例分析(续)【荐】.pdf
- 5计算机数字控制理论基础【荐】.pdf
- 5讲编程语言与基本指令【荐】.ppt
- 5软件工程【荐】.ppt
- 6 移动商务【荐】.ppt
- 6 计算机控制系统中的网络与通信技术【荐】.ppt
- 6+多线程与图形图像【荐】.ppt
- 6-WCDMA无线关键技术【荐】.pdf
- 某县纪委监委开展“校园餐”突出问题专项整治工作汇报22.docx
- 中小学校园食品安全与膳食经费管理专项整治工作自查报告66.docx
- 某县委常委、宣传部部长年度民主生活会“四个带头”个人对照检查发言材料.docx
- XX县委领导班子年度述职述廉报告3.docx
- 某县纪委关于校园餐问题整治工作落实情况的报告.docx
- 中小学校园食品安全与膳食经费管理专项整治工作自查报告22.docx
- 某县税务局党委领导班子年度民主生活会“四个带头”对照检查材料.docx
- 某县委书记在县委常委班子年度民主生活会专题学习会上的讲话.docx
- 某县纪委校园餐问题整治工作落实情况的报告.docx
- 某区委副书记、区长年度民主生活会对照检查材料.docx
文档评论(0)