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

  • 相关阅读:
    python re正则表达式
    python logging模块
    python configparse模块&xml模块
    013 内置函数68个
    day011 迭代器闭包
    09 函数初识
    08 文件操作
    07 list和dict for循环遍历索引问题以及深浅拷贝
    05 字典
    04 基本数据类型(list, tuple)
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5181035.html
Copyright © 2011-2022 走看看