เราได้รับอาร์เรย์ ต้องจัดเรียงอาร์เรย์ในลำดับที่ สมาชิกแรกคือค่าน้อยสุด สมาชิกที่สองคือค่ามากสุด สมาชิกที่สามคือค่าน้อยสุดอันดับ 2 สมาชิกที่สี่คือค่ามากสุดอันดับ 2 และทำต่อไป เช่น:
Input : arr[] = { 13, 34, 30, 56, 78, 3 }
Output : { 3, 78, 13, 56, 34, 30 }
Explanation : จัดเรียงเป็น { 1st min, 1st max, 2nd min, 2nd max, 3rd min, 3rd max }
Input : arr[] = { 2, 4, 6, 8, 11, 13, 15 }
Output : { 2, 15, 4, 13, 6, 11, 8 }
แนวทางแก้ปัญหา
ปัญหานี้แก้ได้ด้วยตัวแปร 2 ตัว 'x' และ 'y' ที่ชี้ไปที่สมาชิกน้อยสุดและมากสุด แต่ต้องเรียงอาร์เรย์ก่อน จากนั้นสร้างอาร์เรย์ว่างขนาดเท่าเดิมเก็บอาร์เรย์ที่จัดเรียงใหม่ วนลูปผ่านอาร์เรย์ หากตำแหน่งเป็นเลขคู่ (even index) ใส่ arr[x] และเพิ่ม x หากเป็นเลขคี่ (odd index) ใส่ arr[y] และลด y ทำจน y < x
ตัวอย่างโค้ด
#include <bits/stdc++.h>
using namespace std;
int main() {
int arr[] = { 2, 4, 6, 8, 11, 13, 15 };
int n = sizeof(arr) / sizeof(arr[0]);
// สร้างอาร์เรย์ใหม่เก็บอาร์เรย์ที่จัดเรียงใหม่
int reordered_array[n];
// เรียงอาร์เรย์ต้นฉบับ
sort(arr, arr + n);
// ตัวชี้ไปที่ index น้อยสุดและมากสุด
int x = 0, y = n - 1;
int i = 0;
// วนลูปจน x มากกว่า y
while (x <= y) {
// ถ้า i เป็นเลขคู่ ใส่สมาชิก index x (น้อยสุด)
if (i % 2 == 0) {
reordered_array[i] = arr[x];
x++;
}
// ถ้า i เป็นเลขคี่ ใส่สมาชิก index y (มากสุด)
else {
reordered_array[i] = arr[y];
y--;
}
i++;
}
// พิมพ์อาร์เรย์ที่จัดเรียงใหม่
for (int i = 0; i < n; i++)
cout << reordered_array[i] << " ";
// หรืออัปเดตอาร์เรย์เดิมได้
// for (int i = 0; i < n; i++)
// arr[i] = reordered_array[i];
return 0;
}
ผลลัพธ์
2 15 4 13 6 11 8
คำอธิบายโค้ด
- ตัวแปรเริ่มต้น: x=0 และ y = array_length(n) - 1
- while(x <= y) วนลูปจน x มากกว่า y
- ถ้า i เป็นเลขคู่ (x) ใส่สมาชิก arr[x] เพิ่ม x ขึ้น 1
- ถ้า i เป็นเลขคี่ (y) ใส่สมาชิก arr[y] ลด y ลง 1
- สุดท้าย อาร์เรย์ที่จัดเรียงใหม่เก็บใน reordered_array[]
สรุป
ในบทความนี้ เราอภิบายวิธีจัดเรียงอาร์เรย์เป็นรูปแบบ น้อย มาก น้อยที่2 มากที่2... พร้อมโปรแกรม C++ สามารถเขียนในภาษาอื่นได้เช่น C, Java, Python หวังว่าจะเป็นประโยชน์