笔试题&面试题:找出一个数组中第m小的值并输出
来源:互联网 发布:合山网络花店 编辑:程序博客网 时间:2024/05/08 13:33
题目:找出一个数组中第m小的值并输出。
代码:
#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查找范围的语句完全可以不需要,因为不修改的话每次都是从最左端查找到最右端,结果是一定能够查找出来的,只是效率方面可能就没有加上这两句好了。
0 0
- 笔试题&面试题:找出一个数组中第m小的值并输出
- 面试题-找出数组中第k大小的数,输出数所在的位置
- C语言小试题:找出M行N列矩阵的行最大值,存入数组并输出。
- 面试题—— 找出一个无序整型数组中第k大的数。
- 笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素
- Google面试题 数组中第K小的数字
- Google面试题 数组中第K小的数字
- 互联网面试题:一个数组中找出三个出现奇数次的数字中的一个
- 互联网面试题:一个数组中找出三个出现奇数次的数字中的一个
- C++面试题之写一个函数找出一个整数数组中,第二大的数
- 搜狐笔试题:给定一个实数数组,按序排列(从小到大),从数组从找出若干个数,使得这若干个数的和与M最为接近,描述一个算法,并给出算法的复杂度。
- 笔试题---找出一数组中第二大的值
- 从俩个有序数组中找出第K小的数。要求时间复杂度O(logmin(m,n))
- 笔试题&面试题:顺时针输出一个矩阵
- 在一个无序整型数组中找出第k小的数字
- 数据结构面试题总结5——数组:找出数组中唯一一个出现一次的元素
- 算法题(一)--找出数组中第k大的数并输出其下标(数组中的数有重复)
- 找出这个图形的规律,并输出一个n行m列的图形
- SYVIO M1回顾 - 世界最小的HDMI V1.3掌上媒体播放器
- 排序算法总结
- Sublime Text2 sideBar的字体大小修改
- Sonos的环绕声
- C语言中的强符号与弱符号
- 笔试题&面试题:找出一个数组中第m小的值并输出
- 【POJ】2104 K-th Number 静态第K小——主席树
- hdu 1874
- pfl7695h液晶电视从飞利浦
- HDU 1525 Euclid's Game
- Ouino法国学习系统评价它是如何比其他学习软件
- 下功夫大华股份结果一看
- 3.输入一个字节内的数(0~255)和移动位数。输出移位结果(要求循环移位)提示:系统自带的移位都是非循环的
- linux Phy 设备驱动