2014-02-20 29 views
3

假設我有一個簡單的數組:如何對數組進行排序以使最大值進入中間?

[1, 20, 15, 37, 46, 9] 

我需要使它看起來像這樣:

[1, 9, 15, 46, 37, 20] 

這樣的想法是把最大的價值或者對最大的兩個值中的然後在數組的中間將數字逐漸減少到右側和左側,如同金字塔一樣。

我有幾個想法,但他們似乎不夠優雅。 請指教。

+0

是價值的獨特需要? – VisioN

+0

是的,如果它很重要。 –

+0

你的例子中最大的一對不是'46,37'而不是'15,46'嗎? – Johan

回答

1

我不能給您一個JavaScript的例子,但我首先把每個陣列元件中的命令,那麼枚舉(給出一個索引),然後從前面和後面添加它們在偶數/奇數順序。

[1, 20, 15, 37, 46, 9] 

變得

[1, 9, 15, 20, 37, 46] 

然後打印奇數索引的多達一半的陣列大小,然後從端打印偶數索引回落到中途。

編輯:蟒蛇的樂趣:

tt = sorted([1, 20, 15, 37, 46, 9]) 
print tt[0:len(tt)/2] + list(reversed(tt[len(tt)/2:len(tt)])) 
2

試試這個:

var arr = [1, 20, 15, 37, 46, 9]; 
arr.sort(function (a, b) { 
    return a - b; 
}); 
var arr1 = arr.slice(0, arr.length/2); 
var arr2 = arr.slice(arr.length/2, arr.length); 
arr2.sort(function (a, b) { 
    return b - a; 
}); 
arr = arr1.concat(arr2); 
console.log(arr); 

這種方法是恢復到兩個步驟:

[1, 20, 15, 37, 46, 9] // step 1: sort the entire array 
[1, 9, 15, 20, 37, 46] // step 2: sort the second half of the array 
[1, 9, 15, 46, 37, 20] 
2

這可以優化,但有用。

function pyramid (arr) { 
    var newArr = []; 

    // sort numerically 
    arr.sort(function (a, b) { 
     return a - b; 
    }); 

    // put the biggest in new array 
    newArr.push(arr.pop()); 

    // keep grabbing the biggest remaining item and alternate 
    // between pushing and unshifting onto the new array 
    while (arr.length) { 
     newArr[arr.length % 2 === 0 ? 'push' : 'unshift'](arr.pop()); 
    } 

    return newArr; 
} 

pyramid([1, 20, 15, 37, 46, 9]返回[1, 15, 37, 46, 20, 9]

+1

我要回答相同的問題:通過推送和不移動,您可以在兩側添加元素,四捨五入成爲最大的元素。 –

1

這裏是另一個短鏈的方法:

[1, 20, 15, 37, 46, 9].sort(function(a, b) { 
    return a - b; 
}).map(function(v, i, a) { 
    var p = ~~(a.length/2); 
    return i >= p ? a[a.length - i + p - 1] : v; 
}); 

// [1, 9, 15, 46, 37, 20] 

看起來工作得很好與任何數量的陣列中的元件。

+0

用於'~~'+1 [cool trick](http://rocha.la/JavaScript-bitwise-operators-in-practice) – reergymerej

2
var arr = [1,20,15,37,46,9]; 
arr.sort(function(a,b){ 
return a-b; 
}); 
var right = arr.slice(arr.length/2,arr.length).reverse(); 
var left = arr.slice(0,arr.length/2); 
arr = left.concat(right); 
console.log(arr); 
+0

不錯,簡單。 – reergymerej

0

從剪接的返回是項目的陣列對從original-

function pyramid(arr){ 
    var mid= Math.floor(arr.length/2); 
    var a2= arr.sort(function(a,b){return a-b}).splice(mid); 
    return arr.concat(a2.reverse()); 
} 

var a1= [1, 20, 15, 37, 46, 9]; 
pyramid(a1) 

/*返回的值中刪除:(陣列) 1,9,15,46, 37,20 */

0
var data = [1, 20, 15, 37, 46, 9]; 
arr = data.sort(function(a, b){return a - b}); 
console.log(arr); 

這將返回[1, 9, 15, 20, 37, 46]

+0

這不回答這個問題。 – Badie

0

排數組,減半,然後拼接在一起,當你有更多的元素不工作,以及的技術。一方比另一方「大」。

let arr = [361, 324, 289, 256, 225, 196, 169, 144, 121, 100, 81, 64, 49, 36, 25, 16, 9, 4, 1, 0]; 
arr = arr.slice(arr.length/2).reverse().concat(arr.slice(0,arr.length/2)); 
// [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 361, 324, 289, 256, 225, 196, 169, 144, 121, 100] 

交織奇數和偶數指標看起來更好,只有稍長

arr = arr.filter((v, i)=>i % 2 === 0).reverse().concat(arr.filter((v, i)=>i % 2 === 1)); 
// [1, 9, 25, 49, 81, 121, 169, 225, 289, 361, 324, 256, 196, 144, 100, 64, 36, 16, 4, 0]