没有合适的资源?快使用搜索试试~ 我知道了~
ACM-排序(非常有用)
需积分: 9 2 下载量 79 浏览量
2014-11-15
18:40:40
上传
评论
收藏 702KB DOCX 举报
温馨提示
试读
36页
哈哈,借用了一下我们现在训练的ACM的题,对逍遥参加ACM的同学很有用喔
资源推荐
资源详情
资源评论
ACM-排序算法整理
排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排
序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说
说八大排序就是内部排序。
当 n 较大,则应采用时间复杂度为 O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。
快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速
排序的平均时间最短;
1.插入排序—直接插入排序(Straight Insertion Sort)
基本思想:
将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增 1 的有序表。即:先
将序列的第 1 个记录看成是一个有序的子序列,然后从第 2 个记录逐个进行插入,直至整
个序列有序为止。
要点:设立哨兵,作为临时存储和判断数组边界之用。
直接插入排序示例:
如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所
以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以
插入排序是稳定的。
算法的实现:
1. voidprint(inta[],intn,inti){
2. cout<<i<<":";
3. for(intj=0;j<8;j++){
4. cout<<a[j]<<"";
5. }
6. cout<<endl;
7. }
8.
9.
10. voidInsertSort(inta[],intn)
11. {
12. for(inti=1;i<n;i++){
13. if(a[i]<a[i-1]){//若第 i 个元素大于 i-1 元素,直接插入。小于
的话,移动有序表后插入¨¨
14. intj=i-1;
15. intx=a[i];//复制为哨兵,即存储待排序元素¨¨
16. a[i]=a[i-1];//先后移一个元素¨¨
17. while(x<a[j]){//查找在有序表的插入位置¨¨
18. a[j+1]=a[j];
19. j--;//元素后移¨¨
20. }
21. a[j+1]=x;//插入到正确位置¨¨
22. }
23. print(a,n,i);//打印每趟排序的结果¨¨
24. }
25.
26. }
27.
28. intmain(){
29. inta[8]={3,1,5,7,2,4,9,6};
30. InsertSort(a,8);
31. print(a,8,8);
32. }
效率:
时间复杂度:O(n^2).
其他的插入排序有二分插入排序,2-路插入排序。
2. 插入排序—希尔排序(Shell`s Sort)
希尔排序是 1959 年由 D.L.Shell 提出来的,相对直接排序有较大的改进。希尔排序又叫缩
小增量排序
基本思想:
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”
时,再对全体记录进行依次直接插入排序。
操作方法:
1. 选择一个增量序列 t1,t2,…,tk,其中 ti>tj,tk=1;
2. 按增量序列个数 k,对序列进行 k 趟排序;
3. 每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对
各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长
度即为整个序列的长度。
希尔排序的示例:
算法实现:
我们简单处理增量序列:增量序列 d = {n/2 ,n/4, n/8 .....1}n 为要排序数的个数
即:先将要排序的一组记录按某个增量 d(n/2,n 为要排序数的个数)分成若干组子序列,
每组中记录的下标相差 d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量
(d/2)对它进行分组,在每组中再进行直接插入排序。继续不断缩小增量直至为 1,最后使用
直接插入排序完成排序。
1. voidprint(inta[],intn,inti){
2. cout<<i<<":";
3. for(intj=0;j<8;j++){
4. cout<<a[j]<<"";
5. }
6. cout<<endl;
7. }
8. /**
9. *直接插入排序的一般形式¨
10. *
11. *@paramintdk缩小增量,如果是直接插入排序,dk=1
12. *
13. */
14.
15. voidShellInsertSort(inta[],intn,intdk)
16. {
17. for(inti=dk;i<n;++i){
18. if(a[i]<a[i-dk]){//若第 i 个元素大于 i-1 元素,直接插入。小于的话,
移动有序表后插入¨¨
19. intj=i-dk;
20. intx=a[i];//复制为哨兵,即存储待排序元素¨¨
21. a[i]=a[i-dk];//首先后移一个元素¨¨
22. while(x<a[j]){//查找在有序表的插入位置¨¨
23. a[j+dk]=a[j];
24. j-=dk;//元素后移¨¨
25. }
26. a[j+dk]=x;//插入到正确位置¨¨
27. }
28. print(a,n,i);
29. }
剩余35页未读,继续阅读
资源评论
慕丸
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- QuestionTwo.java
- QuestionOne.java
- OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR).rar
- 简历-求职简历-word-文件-简历模版免费分享-应届生-高颜值简历模版-个人简历模版-简约大气-大学生在校生-求职-实习
- 南京邮电大学数学实验:熟练掌握 Matlab 软件的基本命令和操作
- 简历-求职简历-word-文件-简历模版免费分享-应届生-高颜值简历模版-个人简历模版-简约大气-大学生在校生-求职-实习
- 2017校招真题校园招聘真题算法题(37道)Python源码.zip
- 基于单片机protues仿真的多功能自动饮水机系统设计(仿真图、源代码、演示视频)
- 论文《一种修复流程挖掘事件日志中缺失活动标签的深度学习方法》翻译
- 智慧电厂相关资料发电控制的方式
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功