快排以及查找第K元素
来源:互联网 发布:淘宝上的水弹枪合法吗 编辑:程序博客网 时间:2024/05/14 18:07
1.快排。
快排,合并排序什么的必须熟练掌握啊,这么经典的算法。。。
int qsort_aux(int A[],int p,int q) { //选择最后一个元素x做为参照,将小于x和大于x的元素放在x两侧 int i=p-1,j,x=A[q]; for(j=p;j<q;j++) { if(A[p]<=x) swap(A[++i],A[j]); } swap(A[++i],A[q]); //返回x所在的位置,则左边的元素小于x,右边的大于x return i;} void qsort_complete(int A[],int p,int q) { if(p<r) { int r=qsort_aux(A,p,q); qsort_complete(A,p,r-1); qsort_complete(A,r+1,q); }}
2.寻找第k元素。
第一种简单的想法是先将数组排序,再取第k小元素,根据不同的算法可以知道这种算法的时
间复杂度。如果用快排、合并排序堆排序什么的,时间复杂度为O(NlgN);如过用冒泡或者
插入排序,时间复杂度为O(N^2);当然也有些线性时间排序算法,但是限制条件比较多不
常用。
第二种是采用快排的思想。选取一个数做为参照,把数组元素分为两边,直到找到第k个元素。
这样的时间复杂度为T(n)=O(n*(1+1/2+1/2^2+1/2^3+...1/2^lgn))(这尼玛不会算,囧了。。
)显然有T(n)<O(nlgn)。
int kth_elem(int A[],int n,int k) { int low=0,high=n-1; int i,j,x; //和快排的思想一致,先选取一个数做为参照,分在两边,直到找到第k个元素。这样就可以不用先排序,再去第ku元素。 while(low<=high) { i=low-1; x=A[high]; for(j=low;j<=high;j++) { if(A[j]<=x) swap(A[++i],A[j]); } swap(A[++i],A[j]); if(i==k) return A[i]; else if(i<k) low=i+1; else high=i-1; }}
- 快排以及查找第K元素
- 快排应用-第k大元素
- 数组中最大第K元素(快排思想)
- 查找最小的k个元素-快排、中位数选择(上)
- 查找第K元素
- 利用快排思想找出数组中第k大的元素
- 查找无序数组中的第K个最小值[快排思想]
- 寻找第k大数(快排思想)
- 找最轻最重 快排思想 第K大
- //快排思想第k大
- 第k小数(快排)
- 快排、寻找第k小数和前k小数
- 查找第K大元素
- 658. Find K Closest Elements(快排+折半查找)
- 从n个元素中找出第K小的数 利用快排的思想来实现
- 基于快排 查找数组中出现三次的元素(***)
- 瑶瑶的第K大 (快排+选择一半快排)
- 快排算法及利用快排思想寻找第k大(小)的数
- Linux 多线程
- 字典树
- struct结构体与构造函数
- tomcat 6.0 common没有文件
- Charset与 Encoding区别
- 快排以及查找第K元素
- mysql参数优化
- NT 路径转换成dos路径
- UITableView为group时设置背景透明
- 让svn在使用checkout命令时不含根目录
- SQL数据库开发之视图操作创建视图
- 手把手教你写Linux I2C设备驱动
- HTML中自定义右键菜单功能
- 并查集