笔试题&面试题:找出一个数组中第m小的值并输出
2016-02-04 10:06
344 查看
题目:找出一个数组中第m小的值并输出。
代码:
程序的思路。取数组第m个单元也就是a[m-1]作为每一次循环的一个阈值。将大于a[m-1]的所有放在数组的右边,小于a[m-1]的所有放在数组的左边,假设一直这样循环下去,那么最后a[m-1]这个单元中存放的就一定是第m小的数据。
至于程序中比較难理解的我认为是:
if(j < m-1) left = i; //这一句的意思是。程序是想寻找第m小的数据。可是j<m-1,表示如今这个阈值仅仅大于数组中最多(m-2)个数组,那么要查找的第m小的值一定是比当前阈值大的数,然而存放在数组中。比当前阈值大的数的集合中的第一个数的下标正好是i,由于i是从while(privot < a[i]) i++;这个语句中跳出来的,所以这个时候将左查找范围设置为i。if(i > m-1) right = j;跟上面的理解差点儿相同。
注意:事实上这两个if推断来修正left和right查找范围的语句全然可以不须要,由于不改动的话每次都是从最左端查找到最右端,结果是一定可以查找出来的,仅仅是效率方面可能就没有加上这两句好了。
代码:
#include <stdio.h> int findm_min(int a[], int n, int m) //n代表数组长度,m代表找出第m小的数据 { int left, right, privot, temp; int i, j; left = 0; right = n - 1; while(left < right) { privot = a[m-1]; i = left; j = right; do { while(privot < a[j]) j--; while(privot > a[i]) i++; if(i < j) { temp = a[i]; a[i] = a[j]; a[j] = temp; i ++; j --; } if(i == j && a[i] == privot) return privot; }while(i < j); if(j < m-1) left = i; if(i > m-1) right = j; } return a[m-1]; } int main() { int data_set[10] = {125, 25, 32, 5, 6, 89, 124, 77, 98, 23}; printf("The m math number in the data_set is:%d.\n", findm_min(data_set, 10, 5)); return 0; }代码的分析:
程序的思路。取数组第m个单元也就是a[m-1]作为每一次循环的一个阈值。将大于a[m-1]的所有放在数组的右边,小于a[m-1]的所有放在数组的左边,假设一直这样循环下去,那么最后a[m-1]这个单元中存放的就一定是第m小的数据。
至于程序中比較难理解的我认为是:
if(j < m-1) left = i; //这一句的意思是。程序是想寻找第m小的数据。可是j<m-1,表示如今这个阈值仅仅大于数组中最多(m-2)个数组,那么要查找的第m小的值一定是比当前阈值大的数,然而存放在数组中。比当前阈值大的数的集合中的第一个数的下标正好是i,由于i是从while(privot < a[i]) i++;这个语句中跳出来的,所以这个时候将左查找范围设置为i。if(i > m-1) right = j;跟上面的理解差点儿相同。
注意:事实上这两个if推断来修正left和right查找范围的语句全然可以不须要,由于不改动的话每次都是从最左端查找到最右端,结果是一定可以查找出来的,仅仅是效率方面可能就没有加上这两句好了。
相关文章推荐
- 做程序员的老婆应该注意的一些事情
- 关于App程序员泡沫
- 码农十年连载五
- 面试笔试杂项积累-leetcode 91-95
- 程序员必知的一些快捷键!
- LeetCode29. Divide Two Integers一个好答案
- JAVA面试题
- 回到程序员的世界之配置环境
- 祭奠我逝去的8年码农时光
- 史上最强大的程序猿装X教程
- [转载]资深程序员点评当前某些对Lotus Domino 的不实评论
- 总结Java常见面试题和答案
- 程序员必须知道的10大基础实用算法及其讲解
- 程序员想提升工作效率,就别再做这七件事啦
- 大部分人都会做错的经典JS闭包面试题
- 关于淘点点面试中碰到的架构问题
- 从交互设计浅谈安卓开发有多痛苦,安卓程序员才最值得尊重
- 面试题简单汇总
- 【Html码农】CSS实现背景透明,文字不透明,兼容所有浏览器
- [面试题12]第N个丑数