perl快速获得数字在数组中的排序

某些情况下,有一个已经排好序的数组,如果要获得一个数字在这个数组中的顺序,用遍历的方法会比较慢,如下是一个快速获取位置的函数,会返回:在这个数组中,有多少个值比给定的值要小。

#! /usr/bin/env perl
use strict;
use warnings;

my @array=(1,2,2,3,4,5,6,7,8,9,10);
my $value=shift;
@array=sort{$a<=>$b} @array;

my $percent=&findLess($value,@array);
print "$percent\n";

sub findLess{
    my ($value,@array)=@_;
    my $result=-1;
    my $array_length=@array;
    my $left=0;
    my $right=$array_length-1;
    while(1){
        if($value<=$array[$left]){
            $result=$left;
        }
        elsif($value>$array[$right]){
            $result=$right+1;
        }
        elsif($right-$left<=1){
            if($value>$array[$left]){
                $result=$left+1;
            }
            else{
                $result=$left;
            }
        }
        else{
            my $mid=int(($left+$right)/2);
            # print "mid\t$mid\n";
            if($value<=$array[$mid]){
                $right=$mid;
            }
            else{
                $left=$mid;
            }
            # print "$left\t$right\n";
        }
        last if($result>=0);
    }
    # print "$result\n";
    my $percent=($result)/$array_length;
    return($percent);
}
时间: 2024-07-31 02:39:25

perl快速获得数字在数组中的排序的相关文章

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简

【剑指offer】Q38:数字在数组中出现的次数

与折半查找是同一个模式,不同的是,在这里不在查找某个确定的值,而是查找确定值所在的上下边界. def getBounder(data, k, start, end, low_bound = False): if end < start : return -1 while start <= end: mid = ( start + end ) >> 1 if data[ mid ] > k: end = mid - 1 elif data[ mid ] < k: star

【2】数字在数组中出现的次数

题目:统计一个数字k在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,输出4次 方案一:扫描数组,记录第一个出现的k和最后一个k中间有多少个,时间复杂度为O(n) 方案二:由于数组是有序的,那么我们可以利用二分的思想,求出k在数组中的第一个位置和最后位置相减即可.时间复杂度为O(logN) 注意严格按照良好的C++编码风格 #include<cstdio> #include<cstring> #include<iostream> #in

封装一个函数, 查看数字在数组中是否出现过, 如果出现过就返回数字在数组中的位置,没有出现过返回-1;

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <script> //封装一个函数, 查看数字在数组中是否出现过, 如果出现过就返回数字在数组中的位置,没有出现过返回-1; //实例: console.log(indexOf(1, [1, 2, 3, 4, 5])) 返

算法导论:快速找出无序数组中第k小的数

题目描述: 给定一个无序整数数组,返回这个数组中第k小的数. 解析: 最平常的思路是将数组排序,最快的排序是快排,然后返回已排序数组的第k个数,算法时间复杂度为O(nlogn),空间复杂度为O(1).使用快排的思想,但是每次只对patition之后的数组的一半递归,这样可以将时间复杂度将为O(n). 在<算法导论>有详细叙述 这里主要用C++实现,实现思路就是先选取当前数组的第一个数作为"主轴",将后面所有数字分成两部分,前面一部分小于"主轴",后面一部

二分法查找数字在数组中的索引,确定数字对应的索引

场景: 一组数字类型的数据,给出一个数字,求出数字对应的索引 例如: int[] arr=new int[]{1,2,3,4,10,20,30,50,90,100} 我们要求55对应的索引位置. 假设arr数组中存储是数字范围的起始值(按范围求索引也可以应用此算法场景) 那么索引对值的表格为: 索引 1 2 3 4 5 6 7 8 9 10 值 1 2 3 4 10 20 30 50 90 100 · 我们使用二分法来求出50对应应该所在索引位置 一.实例解析 算法如下所示 int Search

js数组中sort排序注意的地方

var a=[1,2,3,4,5] function sum(a,b) { return a-b } //从小到大 function obj(a,b) { return b-a } //从大到小 a.sort(sum(a,b)) 调用sort方法后,数组本身会被改变,即影响原数组 默认情况下sort方法是按ascii字母顺序排序的,而非我们认为是按数字大小排序

经典算法学习——快速找出数组中两个数字,相加等于某特定值

这个算法题的描述如下:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值.目前我假设数组中的都是各不相等的整数.这道题是我在一次面试中被问到的,由于各种原因,我没回答上来,十分尴尬.其实这道题十分简单,我们使用相对巧妙的方法来实现下.注意不使用两层循环的元素遍历.示例代码上传至:https://github.com/chenyufeng1991/SumTo100 . 算法描述如下: (0)首先对原数组进行排序,成为递增数组: (1)对排序后的数组头部i [0]和数组尾部j [n-1]

查找数组中重复的数字

题目来源于<剑指Offer>中的面试题3:找出数组中重复的数字. // 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, // 也不知道每个数字重复了几次.请找出数组中任意一个重复的数字.例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3}, // 那么对应的输出是重复的数字2或者3. 解决方法有多种,包括数组排序,哈希表法,以及作者推荐的重排数组法.此处介绍自己的一个做法,以空间换时间,通过新建数组来实现快速查