算法竞赛入门经典:第八章 高效算法设计 8.4快速排序应用之第k小的数
2015-08-18 09:42
459 查看
/* 第k小的数: 输入n个整数和一个正整数k(1<=k<=n),输出这些整数从小到大排序后的第k个(例如k=1就是最小值)。n<=10^7 思路: 排序后再输入下标k-1的元素,nlogn = 10^7*300=3*10^9 书析: 利用快速排序分解[low,high]为[low,iPos-1]和[iPos+1,high]时,由于左边全部小于等于枢轴, 只需判断左边序列:iPos-1-low+1=iPos-low的个数=k-1,此时,枢轴必为第k大元素 输入: 8 1 9 6 3 4 7 9 0 3 8 1 9 6 3 4 7 9 0 5 8 1 9 6 3 4 7 9 0 8 8 1 9 6 3 4 7 9 0 1 输出: 3 6 9 0 */ /* 关键: 1 利用快速排序分解[low,high]为[low,iPos-1]和[iPos+1,high]时,由于左边全部小于等于枢轴, 只需判断左边序列:iPos-1-low+1=iPos-low的个数=k-1,此时,枢轴必为第k大元素 2 if(iPos - low == k-1)//如果左边的元素个数刚好等于k-1,说明iPos中的iArr[iPos]即为第k个元素 else if(iPos - low < k-1)//如果左边的元素个数小于k-1,说明第k小的元素在右边的序列中,只在右边求解,同时应将已经左边的个数舍弃,更新k的值 { k = k - (iPos - low) - 1;//由于枢轴也被舍弃,这里需要多减1个1 quickSort(iArr,iPos+1,high,k); } else//在左边,k不需要更新 { quickSort(iArr,low,iPos-1,k); } 3 else if(low == high)//如果low = high,说明已经走到尽头 */ #include <stdio.h> #define MAXSIZE 1024 int partition(int* iArr,int low,int high) { int iVal = iArr[low]; while(low < high) { while(low < high && iArr[high] >= iVal) { high--; } iArr[low] = iArr[high]; while(low < high && iArr[low] <= iVal) { low++; } iArr[high] = iArr[low]; } iArr[low] = iVal; return low; } int quickSort(int* iArr,int low,int high,int& k) { if(low < high) { int iPos = partition(iArr,low,high); if(iPos - low == k-1)//如果左边的元素个数刚好等于k-1,说明iPos中的iArr[iPos]即为第k个元素 { return iArr[iPos]; } else if(iPos - low < k-1)//如果左边的元素个数小于k-1,说明第k小的元素在右边的序列中,只在右边求解,同时应将已经左边的个数舍弃,更新k的值 { k = k - (iPos - low) - 1;//由于枢轴也被舍弃,这里需要多减1个1 quickSort(iArr,iPos+1,high,k); } else//在左边,k不需要更新 { quickSort(iArr,low,iPos-1,k); } } else if(low == high)//如果low = high,说明已经走到尽头 { return iArr[low]; } } void process() { int n,k; while(EOF != scanf("%d",&n)) { int iArr[MAXSIZE]; for(int i = 0 ; i < n ; i++) { scanf("%d",&iArr[i]); } scanf("%d",&k); int iRes = quickSort(iArr,0,n-1,k); printf("%d\n",iRes); } } int main(int argc,char* argv[]) { process(); getchar(); return 0; }
相关文章推荐
- 学习网站推荐
- AFN里的https 的AFSecurityPolicy
- ObjC第五节:协议和分类
- 生成表insert into语句的存储过程
- 一种高效无锁内存队列的实现
- unsigned int 与 字符串 之间相互转换
- Rpc 详解
- POJ 2155 Matrix
- WinForm点击按钮在对应的panel里画图
- CSS中属性position位置详解功能讲解与实例分析
- 阿里校招在线笔试
- cocos2dx ——屏幕适配
- Linux下MySQL的彻底卸载和安装配置字符集 .
- poj 1985 Cow Marathon【树的直径裸题】
- android中保存一个ArrayList到SharedPreferences的方法
- hdu5380 贪心+双端队列
- js 小数取整的函数
- TProfiler
- IP地址子网掩码主机地址网络号主机号
- POJ 2195 Going Home