由快速排序引出的第k大的数..
2015-07-15 09:01
369 查看
//快速排序 void qsort_my(vector<int> & nums, int st, int ed){ if(st > ed) return; int key = nums[st]; int i = st, j = ed; while(i < j){ while(i < j && nums[j] >= key) --j; nums[i] = nums[j]; while(i < j && nums[i] <= key) ++i; nums[j] = nums[i]; } nums[i] = key; qsort_my(nums, st, i - 1); qsort_my(nums, j + 1, ed); } //单个无序表第K大的数 int KthNum(vector<int> nums, int st, int ed, int k){ int key = nums[st]; int i = st, j = ed; while(i < j){ while(i < j && nums[j] >= key) --j; nums[i] = nums[j]; while(i < j && nums[i] <= key) ++i; nums[j] = nums[i]; nums[i] = key; } nums[i] = key; if(k == i - st + 1) return key; else if(k > i - st + 1) return KthNum(nums, i + 1, ed, k - i + st - 1); else return KthNum(nums, st, i - 1, k); } //两个有序表第K大的数 int KthNum2(vector<int> nums1, int st1, int ed1, vector<int> nums2, int st2, int ed2, int k){ if(st1 > ed1) return nums2[st2 + k - 1]; else if(st2 > ed2) return nums1[st1 + k - 1]; else if(k == 1) return min(nums1[st1], nums2[st2]); int pt1 = min(k / 2 + st1 - 1, ed1); int pt2 = min(k / 2 + st2 - 1, ed2); if(nums1[pt1] >= nums2[pt2]) return KthNum2(nums1, st1, ed1, nums2, pt2 + 1, ed2, k - pt2 + st2 - 1); else return KthNum2(nums1, pt1 + 1, ed1, nums2, st2, ed2, k - pt1 + st1 - 1); }
相关文章推荐
- Object - C 语言中的数据存储容器
- 谈谈团队士气问题
- Android 不同drawable下的图片应按照什么样的比例生成
- 从TCP协议的原理来谈谈rst复位攻击
- profile_oracle设置某用户密码永不过期
- LeetCode题解:Power of Two
- windows7 关闭和启用IPV6隧道适配器
- POJ1201 差分约束
- Win10全新Edge浏览器 谷歌也可作为默认搜索引擎
- Grails最佳实践
- STM32并口驱动AD9854——HAL库
- linux中strcpy strncpy memcpy sprintf snprintf区别总结
- Cocos观察者设计模式和通报机制
- Android 使用zxing包生成中间有logo的二维码图片
- windows 下redis使用
- 自适应网页设计(Responsive Web Design)
- 如何写出无法维护的代码
- oracle rac 日志体系结构
- Android 优化SQLite数据库
- asp.net弹出层实例