關於排序問題的思考

今天去面試,被問到了如下問題:git

從1000個正整數中找出最大的五個數

個人解法

思路:先生成一個含1000個數的隨機數組Arr1,而後創建一個空數組Arr2,及一個變量max=0。
而後遍歷Arr1,其中大於max的數存入數組2。便利事後,獲得遞增數組Arr2。
用slice方法取Arr2後五位即爲最大五位。
`github

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);

`
運行結果以下:
clipboard.png面試

這個算法看似能找出最大數,可是存在如下問題:
當Arr1爲[100,999,...,1]這樣的遞減數列時,只能找出第一個最大數,沒法將Arr2湊滿。並且,面試官還問到了時間複雜度的問題,當時我並無概念。算法

問題分析

爲妥善解決問題,仍是將Arr1數組從小到大從新排列,這樣就不會受到原數據中大小次序影響。
所以能夠採用算法學中的排序方法,如冒泡排序、選擇排序、插入排序等。數組

概念解釋

算法複雜度的概念(包括時間複雜度和空間複雜度):dom

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

排序算法的Javascript實現:優化

https://github.com/damonare/S...

解法優化

以前解法的時間複雜度爲O(n)。
如今採用更穩妥的,可排序的冒泡排序算法,時間複雜度爲O(n*n)。代碼實現以下:spa

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);

代碼運行截圖:
clipboard.png.net

最後

顯然,實現了目的,可是算法上還能夠採用時間複雜度更低的算法。code

相關文章
相關標籤/搜索