ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:50.04KB ,
资源ID:8725411      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8725411.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序.docx

1、10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序各种排序算法总结排序算法有很多,所以在特定情景中使用哪一种算法很重要。为了选择合适的算法,可以按照建议的顺序考虑以下标准:(1)执行时间(2)存储空间(3)编程工作对于数据量较小的情形,(1)(2)差别不大,主要考虑(3);而对于数据量大的,(1)为首要。主要排序法有:一、冒泡(Bubble)排序相邻交换 Bubble Sort二、选择排序每次最小/大排在相应的位置 Selection Sort三、插入排序将下一个插入已排好的序列中 Insert Sort四、谢尔排序缩小增量 Shell Sort五、归并排序 Merge Sort六、快速

2、排序 Quick Sort七、堆排序 Heap Sort八、拓扑排序 Top Sort九、锦标赛排序 Tournament Tree Sort十、基数排序 Radix Sort一、冒泡(Bubble)排序-Code 从小到大排序n个数-void BubbleSortArray() for(int i=1;in;i+) for(int j=0;iaj+1)/比较交换相邻元素 int temp; temp=ai; aj=aj+1; aj+1=temp; -Code-效率 O(n),适用于排序小列表。二、选择排序-Code 从小到大排序n个数-void SelectSortArray() int m

3、in_index; for(int i=0;in-1;i+) min_index=i; for(int j=i+1;jn;j+)/每次扫描选择最小项 if(arrjarrmin_index) min_index=j; if(min_index!=i)/找到最小项交换,即将这一项移到列表中的正确位置 int temp; temp=arri; arri=arrmin_index; arrmin_index=temp;-Code-效率O(n),适用于排序小的列表。三、插入排序-Code 从小到大排序n个数-void InsertSortArray()for(int i=1;i=0 & arrjtem

4、p)/*将temp与已排序元素从小到大比较,寻找temp应插入的位置*/ arrj+1=arrj; j-;arrj+1=temp;-Code-最佳效率O(n);最糟效率O(n)与冒泡、选择相同,适用于排序小列表若列表基本有序,则插入排序比冒泡、选择更有效率。四、谢尔(Shell)排序缩小增量排序-Code 从小到大排序n个数-void ShellSortArray() for(int incr=3;incr0;incr-)/增量递减 for(int L=0;L(n-1)/incr;L+)/重复分成的每个子列表 for(int i=L+incr;i=0&arrjtemp) arrj+incr=a

5、rrj; j-=incr;arrj+incr=temp;-Code-适用于排序小列表。效率估计O(nlog2n)O(n1.5),取决于增量值的最初大小。建议使用质数作为增量值,因为如果增量值是2的幂,则在下一个通道中会再次比较相同的元素。壳(Shell)排序改进了插入排序,减少了比较的次数。是不稳定的排序,因为排序过程中元素可能会前后跳跃。五、归并排序-Code 从小到大排序-void MergeSort(int low,int high) if(low=high) return;/每个子列表中剩下一个元素时停止 else int mid=(low+high)/2;/*将列表划分成相等的两个子

6、列表,若有奇数个元素,则在左边子列表大于右侧子列表*/ MergeSort(low,mid);/子列表进一步划分 MergeSort(mid+1,high); int B=new int high-low+1;/新建一个数组,用于存放归并的元素 for(int i=low,j=mid+1,k=low;i=mid & j=high;k+)/*两个子列表进行排序归并,直到两个子列表中的一个结束*/ if (arri=arrj;) Bk=arri; I+;else Bk=arrj; j+; for( ;j=high;j+,k+)/如果第二个子列表中仍然有元素,则追加到新列表 Bk=arrj; for

7、( ;i=mid;i+,k+)/如果在第一个子列表中仍然有元素,则追加到新列表中 Bk=arri; for(int z=0;zhigh-low+1;z+)/将排序的数组B的 所有元素复制到原始数组arr中 arrz=Bz;-Code-效率O(nlogn),归并的最佳、平均和最糟用例效率之间没有差异。适用于排序大列表,基于分治法。六、快速排序-Code-/*快速排序的算法思想:选定一个枢纽元素,对待排序序列进行分割,分割之后的序列一个部分小于枢纽元素,一个部分大于枢纽元素,再对这两个分割好的子序列进行上述的过程。*/ void swap(int a,int b)int t;t =a ;a =b

8、;b =t ; int Partition(int arr,int low,int high) int pivot=arrlow;/采用子序列的第一个元素作为枢纽元素 while (low high) /从后往前栽后半部分中寻找第一个小于枢纽元素的元素 while (low = pivot) -high; /将这个比枢纽元素小的元素交换到前半部分 swap(arrlow, arrhigh); /从前往后在前半部分中寻找第一个大于枢纽元素的元素 while (low high &arr low =pivot ) +low ; swap (arr low ,arr high );/将这个枢纽元素大

9、的元素交换到后半部分 return low ;/返回枢纽元素所在的位置 void QuickSort(int a,int low,int high) if (low high ) int n=Partition (a ,low ,high ); QuickSort (a ,low ,n ); QuickSort (a ,n +1,high ); -Code-平均效率O(nlogn),适用于排序大列表。此算法的总时间取决于枢纽值的位置;选择第一个元素作为枢纽,可能导致O(n)的最糟用例效率。若数基本有序,效率反而最差。选项中间值作为枢纽,效率是O(nlogn)。基于分治法。七、堆排序最大堆:后者

10、任一非终端节点的关键字均大于或等于它的左、右孩子的关键字,此时位于堆顶的节点的关键字是整个序列中最大的。思想:(1)令i=l,并令temp kl ;(2)计算i的左孩子j=2i+1;(3)若jkj,则令jj1,否则j不变;(5)比较temp和kj,若kjtemp,则令ki等于kj,并令i=j,j=2i+1,并转(3),否则转(6)(6)令ki等于temp,结束。-Code-void HeapSort(SeqIAst R) /对R1.n进行堆排序,不妨用R0做暂存单元 int I; BuildHeap(R); /将R1-n建成初始堆for(i=n;i1;i-) /对当前无序区R1.i进行堆排序,

11、共做n-1趟。 R0=R1; R1=Ri; Ri=R0; /将堆顶和堆中最后一个记录交换 Heapify(R,1,i-1); /将R1.i-1重新调整为堆,仅有R1可能违反堆性质 -Code-堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。 堆排序的最坏时间复杂度为O(nlgn)。堆排序的平均性能较接近于最坏性能。 由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。 堆排序是就地排序,辅助空间为O(1), 它是不稳定的排序方法。堆排序与直接插入排序的区别: 直接选择排序中,为了从R1.n中选出关键字最小的记录,必须进行n

12、-1次比较,然后在R2.n中选出关键字最小的记录,又需要做n-2次比较。事实上,后面的n-2次比较中,有许多比较可能在前面的n-1次比较中已经做过,但由于前一趟排序时未保留这些比较结果,所以后一趟排序时又重复执行了这些比较操作。 堆排序可通过树形结构保存部分比较结果,可减少比较次数。八、拓扑排序例 :学生选修课排课先后顺序拓扑排序:把有向图中各顶点按照它们相互之间的优先关系排列成一个线性序列的过程。方法:在有向图中选一个没有前驱的顶点且输出从图中删除该顶点和所有以它为尾的弧重复上述两步,直至全部顶点均已输出(拓扑排序成功),或者当图中不存在无前驱的顶点(图中有回路)为止。-Code-void

13、TopologicalSort()/*输出拓扑排序函数。若G无回路,则输出G的顶点的一个拓扑序列并返回OK,否则返回ERROR*/ int indegreeM; int i,k,j; char n; int count=0; Stack thestack; FindInDegree(G,indegree);/对各顶点求入度indegree0.num InitStack(thestack);/初始化栈 for(i=0;iG.num;i+) Console.WriteLine(结点+G.verticesi.data+的入度为+indegreei); for(i=0;iG.num;i+) if(in

14、degreei=0) Push(thestack.verticesi); Console.Write(拓扑排序输出顺序为:); while(thestack.Peek()!=null) Pop(thestack.Peek(); j=locatevex(G,n); if (j=-2) Console.WriteLine(发生错误,程序结束。); exit(); Console.Write(G.verticesj.data); count+; for(p=G.verticesj.firstarc;p!=NULL;p=p.nextarc) k=p.adjvex; if (!(-indegreek)

15、Push(G.verticesk); if (countG.num) Cosole.WriteLine(该图有环,出现错误,无法排序。); else Console.WriteLine(排序成功。);-Code-算法的时间复杂度O(n+e)。九、锦标赛排序tounamment sort锦标赛排序的算法思想与体育比赛类似。 首先将n个数据元素两两分组,分别按关键字进行比较,得到n2个比较的优胜者(关键字小者),作为第一步比较的结果保留下来, 然后对这n2个数据元素再两两分组,分别按关键字进行比较,如此重复,直到选出一个关键字最小的数据元素为止。 -Code in C-#include #incl

16、ude #include #include #define SIZE 100000#define MAX 1000000struct nodelong num;/关键字char str10;int lastwin;/最后胜的对手int killer;/被击败的对手long times;/比赛次数dataSIZE;long CompareNum=0;long ExchangeNum=0;long Read(char name)/读取文件a.txt中的数据,并存放在数组data中;最后返回数据的个数FILE *fp;long i=1;fp=fopen(name,rw);fscanf(fp,%d%s

17、,&datai.num,datai.str);while(!feof(fp)i+;fscanf(fp,%d%s,&datai.num,datai.str);return (i-1);long Create(long num)/创建胜者树,返回冠军(最小数)在数组data中的下标int i,j1,j2,max,time=1;long min;/记录当前冠军的下标for(i=1;pow(2,i-1)num;i+);max=pow(2,i-1);/求叶子结点数目for(i=1;inum)datai.num=MAX;for(i=1;i=max;i+=2)/第一轮比赛+CompareNum;if(dat

18、ai.num = datai+1.num)datai.lastwin = i+1;datai+1.killer=i;+datai.times;+datai+1.times;min=i;elsedatai+1.lastwin=i;datai.killer=i+1;+datai.times;+datai+1.times;min=i+1;j1=j2=0;/记录连续的两个未被淘汰的选手的下标while(time = (log(max)/log(2)/进行淘汰赛for(i=1;i=max;i+)if(datai.times=time & datai.killer=0)/找到一名选手j2=i;/默认其为两

19、选手中的后来的if(j1=0)/如果第一位置是空的,则刚来的选手先来的j1=j2;else/否则刚来的选手是后来的,那么选手都已到场比赛开始+CompareNum;if(dataj1.num = dataj2.num)/先来的选手获胜dataj1.lastwin = j2;/最后赢的是j2dataj2.killer=j1;/j2是被j1淘汰的+dataj1.times;+dataj2.times;/两选手场次均加1min=j1;/最小数下标为j1j1=j2=0;/将j1,j2置0else/同理dataj2.lastwin=j1;dataj1.killer=j2;+dataj1.times;+d

20、ataj2.times;min=j2;j1=j2=0;time+;/轮数加1return min;/返回冠军的下标void TournamentSort(long num)/锦标赛排序long tag=Create(num);/返回最小数下标FILE *fp1;fp1=fopen(sort.txt,w+);/为写入创建并打开文件sort.txtwhile(datatag.num != MAX)/当最小值不是无穷大时printf(%d %sn,datatag.num,datatag.str);/输出数据fprintf(fp1,%d %sn,datatag.num,datatag.str);/写入数据datatag.num=MAX;/将当前冠军用无穷大替换tag=Create(num);/返回下一个冠军的下标int main()int num;char name10;printf(Input name of the file:);gets(name);num=Read(name);/读文件TournamentSort(num);/锦标赛排序printf(CompareNum=%dnExchangeNum=%dn,CompareNum,ExchangeNum);return 0;-Code-十、基数排序基数排序又被称为桶排序。与前

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1