การหมุนอาร์เรย์ (Array Rotation)
การหมุนอาร์เรย์คือการเปลี่ยนลำดับองค์ประกอบ โดยเพิ่มดัชนี (index) ของแต่ละองค์ประกอบ และย้ายองค์ประกอบสุดท้ายไปเป็นตัวแรก
ตัวอย่าง
Array[] = {3, 6, 8, 1, 4, 10}
หมุน 2 ครั้ง → Array[] = {1, 4, 10, 3, 6, 8}อัลกอริทึมการกลับด้าน (Reversal Algorithm)
แบ่งอาร์เรย์เป็น 2 ส่วนย่อย กลับด้านแต่ละส่วน แล้วนำมารวมกันและกลับด้านอีกครั้ง
ขั้นตอน
- แบ่งอาร์เรย์เป็น 2 ส่วน: a1[0 ถึง d-1] และ a2[d ถึง n-1]
- กลับด้านทั้งสองอาร์เรย์ย่อย
- รวม a1 และ a2 กลับเป็นอาร์เรย์เดิม
- กลับด้านอาร์เรย์ที่รวมแล้ว → ได้อาร์เรย์ที่หมุนแล้ว
ตัวอย่าง
arr[] = {1, 4, 2, 8, 3, 6, 5}, d = 3, n = 7
a1[] = {1, 4, 2} a2[] = {8, 3, 6, 5}
a1r[] = {2, 4, 1} a2r[] = {5, 6, 3, 8}
ar[] = {2, 4, 1, 5, 6, 3, 8} (a1r + a2r)
arr[] = {8, 3, 6, 5, 1, 4, 2} (กลับด้าน ar) ← ผลลัพธ์โค้ดภาษา C
#include <stdio.h>
void reverse(int arr[], int start, int end) {
int temp;
while (start < end) {
temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}
int main() {
int arr[] = {54, 67, 12, 76, 25, 16, 34};
int n = 7;
int d = 2;
printf("The initial array is :\n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
reverse(arr, 0, d - 1);
reverse(arr, d, n - 1);
reverse(arr, 0, n - 1);
printf("\nThe left reversed array by %d elements is:\n", d);
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}ผลลัพธ์
The initial array is : 54 67 12 76 25 16 34 The left reversed array by 2 elements is: 12 76 25 16 34 54 67