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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(漫谈经典排序算法二.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

漫谈经典排序算法二.docx

1、漫谈经典排序算法二11月热门下载资源TOP100强力推荐! 点击了解英特尔云计算 漫谈经典排序算法:二、各种插入排序解析及性能比较分类: Data Structures And Algorithms2011-09-17 09:55700人阅读评论(0)收藏举报1、序言这是漫谈经典排序算法系列第二篇,解析了各种插入排序算法。主要包括:直接插入排序、折半插入排序、表插入排序、希尔插入排序。每一种算法的开头都叙述了引出该算法的原因,然后给出代码,最后分析算法效率及和其他插入排序相比,优劣在哪里。各种排序算法的解析请参考如下: 漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析漫谈经典排序算法:二

2、、各种插入排序解析及性能比较漫谈经典排序算法:三、冒泡排序 & 快速排序漫谈经典排序算法:四、归并排序漫谈经典排序算法:五、线性时间排序(计数、基数、桶排序)漫谈经典排序算法:六、各种排序算法总结注:为了叙述方便,本文以及源代码中均不考虑A0,默认下标从1开始。2、直接插入排序2.1 引出给定待排序序列A 1.n ,现假设A1.i已经有序,那么我们取出Ai+1插入到序列A1.i.这样有序序列记录数就增加了1.如此重复上述操作,不断取出记录插入有序序列,直到An插入到有序序列,排序完成。2.2 代码view plaincopy to clipboardprint?1. /直接插入排序 2. vo

3、id straightInsertSort(int *a,int n) 3. 4. int i,j; 5. int temp; 6. /逐个记录插入有序序列 7. for(i=2;i=1;j-) 11. if(temphigh) 6. return low; 7. if(amid=key) 8. return mid; 9. else if(keyamid) 10. return binarySearch(a,low,mid-1,key); 11. else 12. return binarySearch(a,mid+1,high,key); 13. 14. 15. /折半插入排序 16. v

4、oid binaryInsertSort(int *a,int n) 17. 18. int i,j,site,temp; 19. for(i=2;isite;j-) 25. aj=aj-1; 26. /3.插入ai 27. asite=temp; 28. 29. 3.3 效率分析折半插入排序是对直接插入排序的一种改进,这种改进只考虑了关键字比较次数,并没有减少移位次数,所以平均时间和最坏情况下(待排序序列逆序)时间复杂度o(n2),如果记录数量很大的话,这两种情况下是优于直接插入排序。再来看一下最佳情况(待排序序列有序),此时关键字比较次数并不为o(1),时间复杂度为o(n*log2n)。(

5、其中折半查找时间复杂度o(log2n),这个在以后写查找的时候再分析,这里不做详细讲解。)。所以在记录数较小、待排序序列基本有序情况下直接插入排序优于折半插入排序。此外,折半插入排序是不稳定的原地排序,实现起来也较复杂。4、表插入排序4.1 引出折半插入排序相对于直接插入排序来说减少了比较次数。那么我们可不可以减少移动次数呢,答案是可以的。于是就有了表插入排序,用一个静态链表来存储待排序序列,其他操作和直接插入排序很像。主要步骤:1、初始化链表 2、取出要插入的记录 3、遍历链表寻找插入位置 4、记录插入链表中。4.2 代码view plaincopy to clipboardprint?1.

6、 /静态链表 2. typedef struct 3. 4. int key;/关键字 5. int next;/指向下一个关键字的下标 6. Node,*PNode; 7. 8. /表插入排序 9. void tableInsertSort(PNode list,int n) 10. 11. int p,head; 12. int i; 13. /初始化 14. list0.next=1; 15. list1.next=0; 16. 17. /逐个插入 18. for(i=2;i=n;i+) 19. head=0; 20. p=list0.next; 21. /遍历链表,寻找插入位置 22.

7、 while(p!=0 & listp.key=listi.key) 23. head=p; 24. p=listp.next; 25. 26. if(p=0)/插入的值是最大值 27. listi.next=p; 28. listhead.next=i; 29. else 30. listi.next=p; 31. listhead.next=i; 32. 33. 34. 35. 4.3 效率分析表插入排序也是对直接插入排序的一种改进,这种改进只减少了移动次数,并没有减少关键字比较次数,所以平均时间和最坏情况下(待排序序列逆序)时间复杂度o(n2),如果记录数量很大的话,这两种情况下是优于直

8、接插入排序。再来看一下最佳情况(待排序序列有序),关键字比较次数并为o(1),时间复杂度为o(n)。此时和直接插入排序时间复杂度一样。此外,表插入排序改变了记录的存储结构,无法顺序访问,是一种稳定的排序算法,实现起来也较复杂。5、希尔插入排序5.1 引出上述两种排序都是只考虑减少关键字比较次数或者只考虑减少关键字移动次数。有没有别的改进办法呢?我们注意到,直接插入排序适合于记录数较少、基本有序的情况。于是我们可以先将整个待排序序列分割成若干子序列分别进行直接插入排序,整个序列基本有序时,再对序列进行一次直接插入排序。这就是希尔排序。5.2 代码view plaincopy to clipboa

9、rdprint?1. /一趟增量为dk的希尔插入排序 2. void shellInsert(int *a,int n,int dk) 3. 4. int i,j,temp; 5. for(i=dk+1;i=0;j-=dk) 8. if(ajtemp) 9. aj+dk=aj; 10. else 11. break; 12. aj+dk=temp; 13. 14. 15. 16. /希尔排序 17. void shellSort(int *a,int n) 18. 19. int i; 20. int dk=5,4,3,2,1; 21. for(i=0;i5;i+) 22. shellInse

10、rt(a,6,dki); 23. 5.3 效率分析当给定序列记录量较大时,希尔排序性能优于直接插入排序。再希尔排序的过程中,关键字是跳跃式移动的,这样就减少了移动次数。希尔排序性能的分析是一个复杂的问题,时间与所取的增量有关。增量选取的不好可能会大大降低排序效率。6、附录附录一、参考书籍数据结构严蔚敏版附录二、所有源代码view plaincopy to clipboardprint?1. #include 2. 3. /直接插入排序 4. void straightInsertSort(int *a,int n) 5. 6. int i,j; 7. int temp; 8. /逐个记录插入有

11、序序列 9. for(i=2;i=1;j-) 13. if(tempaj) 14. aj+1=aj; 15. else 16. break; 17. 18. aj+1=temp; 19. 20. 21. 22. 23. void main() 24. 25. int i; 26. int a7=0,3,5,8,9,1,2;/不考虑a0 27. straightInsertSort(a,6); 28. for(i=1;i=6;i+) 29. printf(%-4d,ai); 30. printf(n); 31. view plaincopy to clipboardprint?1. #inclu

12、de 2. 3. /折半查找 4. int binarySearch(int *a,int low,int high,int key) 5. 6. int mid=(low+high)/2; 7. if(lowhigh) 8. return low; 9. if(amid=key) 10. return mid; 11. else if(keyamid) 12. return binarySearch(a,low,mid-1,key); 13. else 14. return binarySearch(a,mid+1,high,key); 15. 16. 17. /折半插入排序 18. voi

13、d binaryInsertSort(int *a,int n) 19. 20. int i,j,site,temp; 21. for(i=2;isite;j-) 27. aj=aj-1; 28. /3.插入ai 29. asite=temp; 30. 31. 32. 33. void main() 34. 35. int i; 36. int a7=0,3,5,8,9,1,2;/不考虑a0 37. binaryInsertSort(a,6); 38. for(i=1;i=6;i+) 39. printf(%-4d,ai); 40. printf(n); 41. view plaincopy

14、to clipboardprint?1. #include 2. #define MAX 10000 3. 4. /静态链表 5. typedef struct 6. 7. int key;/关键字 8. int next;/指向下一个关键字的下标 9. Node,*PNode; 10. 11. /表插入排序 12. void tableInsertSort(PNode list,int n) 13. 14. int p,head; 15. int i; 16. /初始化 17. list0.next=1; 18. list1.next=0; 19. 20. /逐个插入 21. for(i=2

15、;i=n;i+) 22. head=0; 23. p=list0.next; 24. /遍历链表,寻找插入位置 25. while(p!=0 & listp.key=listi.key) 26. head=p; 27. p=listp.next; 28. 29. if(p=0)/插入的值是最大值 30. listi.next=p; 31. listhead.next=i; 32. else 33. listi.next=p; 34. listhead.next=i; 35. 36. 37. 38. 39. 40. void main() 41. 42. int p; 43. Node list

16、7=MAX,0,3,0,5,0,8,0,9,0,1,0,2,0; 44. tableInsertSort(list,6); 45. p=list0.next; 46. while(p!=0) 47. printf(%-4d,listp.key); 48. p=listp.next; 49. 50. printf(n); 51. view plaincopy to clipboardprint?1. #include 2. 3. /一趟增量为dk的希尔插入排序 4. void shellInsert(int *a,int n,int dk) 5. 6. int i,j,temp; 7. for(

17、i=dk+1;i=0;j-=dk) 10. if(ajtemp) 11. aj+dk=aj; 12. else 13. break; 14. aj+dk=temp; 15. 16. 17. 18. /希尔排序 19. void shellSort(int *a,int n) 20. 21. int i; 22. int dk=5,4,3,2,1; 23. for(i=0;i5;i+) 24. shellInsert(a,6,dki); 25. 26. 27. void main() 28. 29. int i; 30. int a7=0,3,5,8,9,1,2;/不考虑a0 31. shellSort(a,6); 32. for(i=1;i=6;i+) 33. printf(%-4d,ai); 34. printf(n); 35.

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

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