ปัญหา
จัดเรียงอาร์เรย์ให้เป็น pattern: arr[0] < arr[1] > arr[2] < arr[3] ... (wiggle sort)
ตัวอย่าง
input: [1, 5, 1, 1, 6, 4] output: [1, 6, 1, 5, 1, 4] (หนึ่งในคำตอบ)
ตัวอย่างโค้ด
const arr = [1, 5, 1, 1, 6, 4];
const unevenSort = (arr = []) => {
arr.sort((a, b) => a - b);
let mid = Math.floor(arr.length / 2);
if (arr.length % 2 === 1) {
mid += 1;
}
let even = arr.slice(0, mid);
let odd = arr.slice(mid);
for (let i = 0; i < arr.length; i++) {
if (i % 2 === 0) {
arr[i] = even.pop();
} else {
arr[i] = odd.pop();
}
}
};
unevenSort(arr);
console.log(arr);
ผลลัพธ์
[1, 6, 1, 5, 1, 4]
คำอธิบาย
เรียงอาร์เรย์ แบ่งครึ่ง: ครึ่งเล็ก (even indices), ครึ่งใหญ่ (odd indices)
pop จากท้าย (ค่ามากที่สุดของแต่ละครึ่ง) วางสลับกัน
ได้ pattern: small_big, large_big, small_medium, large_medium ...
Time: O(n log n) เนื่องจาก sort