资讯专栏INFORMATION COLUMN

关于排序问题的思考

txgcwm / 1982人阅读

摘要:今天去面试,被问到了以下问题从个正整数中找出最大的五个数我的解法思路先生成一个含个数的随机数组,然后建立一个空数组,及一个变量。现在采用更稳妥的,可排序的冒泡排序算法,时间复杂度为。

今天去面试,被问到了以下问题:

从1000个正整数中找出最大的五个数
我的解法

思路:先生成一个含1000个数的随机数组Arr1,然后建立一个空数组Arr2,及一个变量max=0。
然后遍历Arr1,其中大于max的数存入数组2。便利过后,得到递增数组Arr2。
用slice方法取Arr2后五位即为最大五位。
`

var Arr1 = [];
for (var i = 0; i<1000; i++){
    Arr1[i] = Math.floor(Math.random()*1000+1);
}; //先生成1000个正整数

var Arr2 = new Array();
var max = 0;

for (var i = 0; i<1000; i++){
    if (Arr1[i]>max){
        Arr2.push(Arr1[i]);
        max = Arr1[i];
    } 
};
var result = Arr2.slice[-5];
console.log(result);

`
运行结果如下:

这个算法看似能找出最大数,但是存在以下问题:
当Arr1为[100,999,...,1]这样的递减数列时,只能找出第一个最大数,无法将Arr2凑满。而且,面试官还问到了时间复杂度的问题,当时我并没有概念。

问题分析

为妥善解决问题,还是将Arr1数组从小到大重新排列,这样就不会受到原数据中大小次序影响。
因此可以采用算法学中的排序方法,如冒泡排序、选择排序、插入排序等。

概念解释

算法复杂度的概念(包括时间复杂度和空间复杂度):

http://blog.csdn.net/booirror...
http://www.jianshu.com/p/99ba...

排序算法的Javascript实现:

https://github.com/damonare/S...
解法优化

之前解法的时间复杂度为O(n)。
现在采用更稳妥的,可排序的冒泡排序算法,时间复杂度为O(n*n)。代码实现如下:

var Arr1 = [];
for (var i = 0; i<1000; i++){
    Arr1[i] = Math.floor(Math.random()*1000+1);
};

function bubbleSort(arr) {
    var len = arr.length;
    for (var i = 0; i < len; i++) {
        for (var j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j+1]) {        //相邻元素两两对比
                var temp = arr[j+1];        //元素交换
                arr[j+1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}

var Arr2 = bubbleSort(Arr1);
var result = Arr2.slice(-5);
console.log(result);

代码运行截图:

最后

显然,实现了目的,但是算法上还可以采用时间复杂度更低的算法。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91975.html

相关文章

  • 关于生成订单号规则一些思考

    摘要:关于我为什么写这篇文章是因为今天在做订单模块的时候看到之前的上描述的年月日用户位企业位四位自增长数。背景对于其定订单的生成。个人的看法是主要是唯一,其他关于业务方面的不是太太重要。自增实现了用于将的值递增,并返回结果。 关于我为什么写这篇文章是因为今天在做订单模块的时候,看到之前的PRD上描述的年月日+用户id2位+企业id位+四位自增长数。然后竟被我反驳的突然改成了精确时间+4位自增...

    omgdog 评论0 收藏0
  • 【趣味连载】攻城狮上传视频与普通人上传视频:(一)生成结构化数据

    摘要:背景当知道要上传的视频资料从条变成条时,我就明白,绝对不能再人工处理了。 背景 当知道要上传的视频资料从20条变成100条时,我就明白,绝对不能再人工处理了。他们总是想当然的认为,录入一条数据需要1分钟,那录入20条数据就是20分钟,录入100条数据,不就是100分钟吗?我有时候,真的很想问问他们,没有考虑过人是会犯错的吗?数据越多,出错的可能就越大;但是数据本身,又是不允许出现纰漏的...

    mindwind 评论0 收藏0
  • 关于排列后数组一些思考(1)

    摘要:问题上看到了一个问题数组排序之后更加再对其进行操作时间缩短了对楼主的实例代码进行了一下重构,代码如下把最高的回答看了下,也就是在的时候,在判定的时候,没有排列时候,每次都要重新进行判断,而排列完之后,当排列完数据大于判断时候,后面所有的数 问题: stackoverflow上看到了一个问题数组排序之后更加再对其进行操作时间缩短了 对楼主的实例代码进行了一下重构,代码如下: publ...

    DC_er 评论0 收藏0

发表评论

0条评论

txgcwm

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<