ในปัญหานี้ เราได้รับอาร์เรย์ของตัวเลข และเราต้องพิมพ์องค์ประกอบของอาร์เรย์ในลำดับที่เพิ่มขึ้นหรือลดลงในขณะที่พิมพ์ ลำดับทางเลือกจะอยู่ในลักษณะที่องค์ประกอบสองตัวแรกอยู่ในลำดับที่เพิ่มขึ้น จากนั้นองค์ประกอบสามตัวถัดไปจะอยู่ในลำดับที่ลดลงอีกครั้งสี่ตัวถัดไปอยู่ในลำดับจากน้อยไปมาก
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากันดีกว่า
Input : {1, 4, 0, 2, 7, 9, 3}
Output : 0 1 9 7 4 2 3 คำอธิบาย − อาร์เรย์ที่เรียงลำดับองค์ประกอบเพิ่มขึ้นคือ 0 1 2 3 4 7 9 2 องค์ประกอบแรกคือ 0 1 องค์ประกอบ 3 ตัวสุดท้ายคือ 9 7 4 ถัดไป 4 องค์ประกอบสี่องค์ประกอบคือ 2 3 (เราสามารถเอา 4 องค์ประกอบ แต่มี เพียง 2 ในอาร์เรย์)
เพื่อแก้ปัญหานี้ ก่อนอื่นเราจะเรียงลำดับอาร์เรย์จากน้อยไปมาก ตอนนี้ เราจะใช้ตัวชี้สองตัวหนึ่งตัวสำหรับการพิมพ์องค์ประกอบตั้งแต่เริ่มต้น และอีกตัวหนึ่งสำหรับองค์ประกอบการพิมพ์ในตอนท้าย นอกจากนี้ เราจะใช้องค์ประกอบแฟล็กหนึ่งรายการเพื่อตรวจสอบว่าต้องพิมพ์ตั้งแต่เริ่มต้นหรือสิ้นสุด
อัลกอริทึม
Step 1 : Sort elements of the array. Step 2 : Initialise left = 0 , right = n-1 , flag = 2. Step 3 : while l is less than equal to r. Do : Step 4 : If flag%2 == 0. Do : Step 4.1 : loop from i = left to left + flag. And print arr[i]. Step 4.2 : update left = i ; flag ++; Step 5 : else. Do : Step 5.1 : loop from i = right to right - flag. And print arr[i]. Step 5.2 : update right = i and flag ++. Step 6 : EXIT
ตัวอย่าง
ตอนนี้ มาสร้างโปรแกรมเพื่อแสดงการทำงานของอัลกอริธึมนี้กัน
#include <bits/stdc++.h>
using namespace std;
void printAlternateSeq(int arr[], int n){
sort(arr, arr + n);
int left = 0, right = n - 1, flag = 2, i;
while (left <= right) {
if (flag%2 == 0) {
for (i = left; i < left + flag && i <= right; i++)
cout<<arr[i]<<" ";
left = i;
} else {
for (i = right; i > right - flag && i >= left; i--)
cout<<arr[i]<<" ";
right = i;
}
flag++;
}
}
int main(){
int n = 6;
int arr[] = {23, 45, 78, 32, 89, 10 };
printAlternateSeq(arr, n);
return 0;
} ผลลัพธ์
10 23 89 78 45 32