笔试题&面试题:找出一个数组中第m小的值并输出

简介:

题目:找出一个数组中第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查找范围的语句全然可以不须要,由于不改动的话每次都是从最左端查找到最右端,结果是一定可以查找出来的,仅仅是效率方面可能就没有加上这两句好了。




本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5181035.html,如需转载请自行联系原作者

相关文章
|
5月前
|
算法
【数组相关面试题】LeetCode试题
【数组相关面试题】LeetCode试题
|
5月前
|
存储
力扣面试经典题之数组/字符串
力扣面试经典题之数组/字符串
45 0
|
5月前
|
算法 前端开发
经典面试题:扁平化嵌套数组
经典面试题:扁平化嵌套数组
40 0
|
2月前
|
C语言
【Amazon 面试题1】一个数组,里面得数出现的次数是偶数次,只有一个数出现的次数是奇数次,找出那个出现奇数次的数
本文介绍了解决Amazon面试题的一种方法,即在一个所有数字出现次数都是偶数,除了一个数字出现奇数次的数组中,利用异或运算的性质找出出现奇数次的数字,并提供了C语言实现的代码示例。
52 1
|
2月前
|
Java
Java 基础语法-面试题(54-63道)(数组+类+包)
Java 基础语法-面试题(54-63道)(数组+类+包)
39 16
|
3月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
|
4月前
|
开发框架 .NET
技术好文共享:面试题:找出数组中只出现一次的2个数(异或的巧妙应用)(出现3次)
技术好文共享:面试题:找出数组中只出现一次的2个数(异或的巧妙应用)(出现3次)
|
4月前
|
数据采集 算法 数据挖掘
LeetCode 题目 80:删除排序数组中的重复项 II【算法面试高频题】
LeetCode 题目 80:删除排序数组中的重复项 II【算法面试高频题】
|
5月前
|
C++
【一刷《剑指Offer》】面试题 14:调整数组顺序使奇数位于偶数前面
【一刷《剑指Offer》】面试题 14:调整数组顺序使奇数位于偶数前面
|
5月前
|
算法 C++
【一刷《剑指Offer》】面试题 8:旋转数组的最小数字
【一刷《剑指Offer》】面试题 8:旋转数组的最小数字