2015郑州大学ACM暑期集训——第三天
2015-08-08 21:40
288 查看
排序
排序在整个ACM比赛过程中,都有着不可或缺的重要意义,当处理一组数据,解决之后的问题时,往往先要通过排序将数据规格化从而为之后的代码做铺垫,使得后面的数据处理大大简化。如果学不会排序,后面的步骤往往无从下手,甚至寸步难行。从深远意义上来讲,以后在找工作,面试过程中,在一面、二面的技术面中,面试官很倾向于给你一堆数据进行排序,从而引发出来后面的问题。当然,每种排序算法的时间复杂度也是要掌握的,这对于以后比赛中估计会不会超时有着重要的作用。
当然,在庞大的c++类库中可以使用现有的排序函数进行排序,但是了解和掌握必备的排序方法是每一个程序员必备的知识。
1.冒泡排序
点击这里查看百度百科算法思想简单描述:
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
代码实现
[code] for (i = 0; i < n - 1; i++) { for (j = 0; j < n -1- i; j++) { if (a[j] > a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } }
参考博客
******
2.选择排序
点击这里查看百度百科算法思想简单描述:
首先以一个元素为基准,从一个方向开始扫描,比如从左到右扫描,以A[0]为基准,接下来从A[0]….A[9]中找出最小的元素,将其与A[0]交换。然后将其基准位置右移一位,重复上面的动作,比如,以A[1]为基准,找出A[1]~A[9]中最小的,将其与A[1]交换。一直进行到将基准位置移到数组最后一个元素时排序结束。
代码实现
[code] for(i=0;i<n-1;i++) { min=i;//查找最小值 for(j=i+1;j<n;j++) if(a[min]>a[j]) min=j;//交换 if(min!=i) { t=a[min]; a[min]=a[i]; a[i]=t; } }
参考博客
******
3.插入排序
点击这里查看百度百科算法思想简单描述:
在得到要排序的数组以后,将数组分为两个部分,数组的第一个元素为一个部分,剩下的元素为一部分,然后从数组的第二个元素开始,和该元素以前的所有元素比较,如果之前的元素没有比该元素大的,那么该元素的位置不变,如果有元素的值比该元素大,那么记录下它所在的位置;例如i,该元素的位置为k,则将从i到k位置上的所有元素往后移动一位,然后将k位置上的值移动到i位置上。这样就找到了K所在的位置。每一个元素都这样进行,最终就会得到排好顺序的数组。
代码实现
[code] voidinsert_sort(int*array,unsignedintn) { int i, j; int temp; for(i =1; i < n; i++) { temp = *(array+i); for(j = i; j > 0 && *(array + j - 1) > temp; j--) { *(array+j) = *(array+j-1); } *(array+j) = temp; } }
参考博客
简单二分检索
点击这里查看百度百科二分查找又称折半查找,采用了分治策略,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
代码实现
[code] void binsearch(int *a, int k, int len)//数组a默认为递增,k为需要查找的元素,len为数组长度 { int low = 0, high = len - 1, mid; while(low <= high) { mid = (low + high) / 2; if (a[mid] == k) { return mid; } if (a[mid] > k) { high = mid - 1; } else { low = mid + 1; } } }
参考博客
相关文章推荐
- sql server 2008 用户 NT AUTHORITY\IUSR 登录失败的解决方法
- linux /proc详解
- 关于取出一个字符串中字母个数的题目分析
- Git安装及常用操作(精简版①)
- javaMail的常见问题
- Spring @Configuration用annotation装配spring
- 【Java编程进阶-1】enum枚举的使用
- Hibernate学习笔记(三) — Hibernate 的一级缓存意义
- HDU1195Open the Lock( BFS )
- DOS常用命令
- ASP入门(一)环境的搭建
- MapReduce作业内调度研究
- scala 第77讲:模式匹配下的提取器动手构造实战
- 微信开发 文档集合 (链接)
- java容器类---Hashtable
- 欧几里德算法及扩展欧几里德
- 存储过程,数据库事务
- jsp的useBean标签使用
- 通过lua获取nginx的内置变量,通过这些变量做些逻辑的处理
- 【Android先进】我们为什么要创建Activity基类Activity什么是一般的基类方法