Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

การจัดเรียงอาร์เรย์แบบพิเศษ: เลขคู่ก่อน เรียงน้อยไปมาก แล้วค่อยเลขคี่ใน JavaScript

ภาพรวม

บทความนี้สาธิตการจัดเรียงอาร์เรย์แบบ 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: เตรียมข้อมูลสำหรับอัลกอริทึมอื่น