ภาพรวม
ได้รับอาร์เรย์จำนวนเต็ม arr[] มีทั้งบวกและลบ งานคือจัดเรียงใหม่ให้อิลิเมนต์ที่ตำแหน่งคู่ (Even index/position) มีค่ามากกว่าอิลิเมนต์ที่ตำแหน่งคี่ (Odd index/position)
ตัวอย่าง
อินพุต − int arr[] = {2, 1, 4, 3, 6, 5, 8, 7}
เอาต์พุต − Array before Arrangement: 2 1 4 3 6 5 8 7
Rearrangement of an array such that even positioned are greater than odd is: 1 2 3 4 5 6 7 8
คำอธิบาย − อาร์เรย์ขนาด 8 จัดเรียงใหม่ให้ตำแหน่งคู่มีค่ามากกว่าตำแหน่งคี่ ได้ 1 2 3 4 5 6 7 8
อินพุต − int arr[] = {-3, 2, -4, -1}
เอาต์พุต − Array before Arrangement: -3 2 -4 -1
Rearrangement of an array such that even positioned are greater than odd is: -4 -3 -1 2
คำอธิบาย − จัดเรียงใหม่ให้ตำแหน่งคู่มากกว่าตำแหน่งคี่ ได้ -4 -3 -1 2
แนวทางการแก้ปัญหา
- รับอาร์เรย์ คำนวณขนาด
- เรียงลำดับอาร์เรย์ด้วย
sort() - เรียก
Rearrangement(arr, size) - ภายในฟังก์ชัน:
- สร้างอาร์เรย์
ptr[size] first = 0, last = size - 1- วน i=0 ถึง size-1:
- หาก
(i+1) % 2 == 0(ตำแหน่งคู่ 1-based)ptr[i] = arr[last--](เอาค่ามากที่สุดเหลือ) - มิฉะนั้น
ptr[i] = arr[first++](เอาค่าน้อยที่สุดเหลือ)
- หาก
- คัดลอก
ptrกลับarr(หรือพิมพ์ptrโดยตรง)
- สร้างอาร์เรย์
- พิมพ์ผลลัพธ์
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
void Rearrangement(int* arr, int size){
int ptr[size];
int first = 0;
int last = size - 1;
for (int i = 0; i < size; i++){
if((i + 1) % 2 == 0){
ptr[i] = arr[last--];
} else {
ptr[i] = arr[first++];
}
}
// คัดลอกกลับ arr หากต้องการ
for (int i = 0; i < size; i++) arr[i] = ptr[i];
}
int main(){
int arr[] = {2, 1, 4, 3, 6, 5, 8, 7};
int size = sizeof(arr) / sizeof(arr[0]);
cout << "Array before Arrangement: ";
for (int i = 0; i < size; i++){
cout << arr[i] << " ";
}
sort(arr, arr + size);
Rearrangement(arr, size);
cout << "\nRearrangement of an array such that even positioned are greater than odd is: ";
for(int i = 0; i < size; i++){
cout << arr[i] << " ";
}
return 0;
}
ผลลัพธ์
Array before Arrangement: 2 1 4 3 6 5 8 7 Rearrangement of an array such that even positioned are greater than odd is: 1 2 3 4 5 6 7 8