qsort()函数及第k小的数
来源:互联网 发布:增值税批量开票软件 编辑:程序博客网 时间:2024/05/16 11:18
下面是自己写的快排函数,测试了几组数据,没有出现错误,现将代码贴上:
void Qsort(int *a,int l,int r){ if(l>=r) return ; int mid=(r+l)/2; int temp=a[mid]; int i=l; int j=r; while(i<j) { while(a[i]<temp) i++; while(a[j]>temp) j--; if(i<j && a[i]==a[j]) j--; else if(i<j) swap(a[i],a[j]); } Qsort(a,l,j-1); Qsort(a,j+1,r); return ;}
下面是利用qsort()函数来求数组a中第k小的数字(1<=k<=n,n<10^7)
分析:
选第k大的数,最显然的方法是先排序,然后直接输出下标为k-1的元素,但10^7的规模即使对于O(nlogn)的算法来说也稍微大了点,有没有其他办法呢?
答案是肯定的。假设在快排之后,数组a[p...r]被划分成a[p..q]和a[q+1..r],可以根据左边元素个数q-p+1和k的大小关系只在左边或者右边递归求解,可以证明,在期望意义下,程序时间复杂度为O(n),代码如下:
int Qsort(int *a,int l,int r,int k){ if(l>=r) { if(l==k-1) return a[l]; if(r==k-1) return a[r]; return -1; } int mid=(r+l)/2; int temp=a[mid]; int i=l; int j=r; while(i<j) { while(a[i]<temp) i++; while(a[j]>temp) j--; if(i<j && a[i]==a[j]) j--; else if(i<j) swap(a[i],a[j]); } if(k-1==j) return a[j]; else if(k-1<j) return Qsort(a,l,j-1,k); else return Qsort(a,j+1,r,k);}
0 0
- qsort()函数及第k小的数
- 回调函数,qsort函数,与qsort函数的模拟
- 第k小的数
- 第k小的数
- [编程珠玑]-第十一章:快速排序及第k小元素
- rqnoj350 第k小的数
- 寻找第K小的数
- 【模拟】找第k小的数
- 寻找第K小的数
- 算法--选择第K小的数
- 寻找第K小的数
- 第k个小的数
- 求第k小的数
- Java 求第K小的数
- 并行计算第k小的数
- 前k小的数求法
- 数组中第k小的数
- 寻找第K小的数
- struts2写出json数据的两种配置
- sql 小笔记
- html中调用vlc
- WaitForSingleObject的使用
- nginx详细配置
- qsort()函数及第k小的数
- Javassist简单应用小结
- 对于ajax传递中文乱码问题,研究js encodeURI 与request.HtmlEncode的区别
- sql
- POJ2909&&POJ1730基础数论
- Android java.lang.SecurityException: Permission Denial: requires android.permission.CALL_PRIVILEGED
- NLP: 中文分词算法--正向最大匹配 Forward Maximum Matching
- VS2010,如何取得一幅图像中某个像素值得快捷方法and将某一点像素值改为指定值
- WERTYU题析