ภาพรวม
บทความนี้สาธิตการจัดเรียงอาร์เรย์แบบ Custom: เรียงเลขคู่ (Even) ก่อนจากน้อยไปมาก แล้วตามด้วยเลขคี่ (Odd) เรียงน้อยไปมาก
ตัวอย่าง
Input: [2, 5, 2, 6, 7, 1, 8, 9]
Output: [2, 2, 6, 8, 1, 5, 7, 9]
การนำไปใช้
const arr = [2, 5, 2, 6, 7, 1, 8, 9];
const isEven = (num) => num % 2 === 0;
const sorter = (a, b) => {
// กรณี a คู่, b คี่ -> a มาก่อน
if (isEven(a) && !isEven(b)) return -1;
// กรณี a คี่, b คู่ -> b มาก่อน
if (!isEven(a) && isEven(b)) return 1;
// ทั้งคู่ หรือ ทั้งคี่ -> เรียงตามค่าตัวเลข
return a - b;
};
const oddEvenSort = (arr) => {
arr.sort(sorter);
};
oddEvenSort(arr);
console.log(arr);
ผลลัพธ์
[2, 2, 6, 8, 1, 5, 7, 9]
วิธีการทันสมัย (Functional, Immutable)
const oddEvenSortModern = (arr) =>
[...arr].sort((a, b) => {
const aEven = a % 2 === 0;
const bEven = b % 2 === 0;
if (aEven !== bEven) return aEven ? -1 : 1;
return a - b;
});
// หรือแยก Filter แล้วค่อย Sort
const oddEvenSortSplit = (arr) => [
...arr.filter(x => x % 2 === 0).sort((a, b) => a - b),
...arr.filter(x => x % 2 !== 0).sort((a, b) => a - b)
];
การขยาย: Custom Parity Sort
// เรียงตาม Modulo ใดๆ ก็ได้
const paritySort = (arr, mod = 2, order = 'asc') => {
const direction = order === 'asc' ? 1 : -1;
return [...arr].sort((a, b) => {
const aMod = a % mod;
const bMod = b % mod;
if (aMod !== bMod) return (aMod - bMod) * direction;
return (a - b) * direction;
});
};
// ตัวอย่าง: mod 3 -> กลุ่มที่หาร 3 ลงตัว, เหลือ 1, เหลือ 2
console.log(paritySort([1,2,3,4,5,6,7,8,9], 3));
// [3, 6, 9, 1, 4, 7, 2, 5, 8]
การประยุกต์ใช้
- Data Presentation: แสดงข้อมูลแบบกลุ่ม (Grouping)
- Priority Queue: Even = High Priority, Odd = Low Priority
- Algorithm Preprocessing: เตรียมข้อมูลสำหรับอัลกอริทึมอื่น