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

อัลกอริทึม Reversal สำหรับ Right Rotation ของอาร์เรย์ใน C++

ในบทความนี้ เราจะเข้าใจอัลกอริทึม Reversal เพื่อหมุนอาร์เรย์ที่กำหนดไปทางขวา k ตำแหน่ง เช่น:

Input : arr[] = { 4, 6, 2, 6, 43, 7, 3, 7 }, k = 4 
Output : { 43, 7, 3, 7, 4, 6, 2, 6 }
Explanation : หมุนแต่ละสมาชิก 4 ตำแหน่งทางขวา ได้ { 43, 7, 3, 7, 4, 6, 2, 6 }

Input : arr[] = { 8, 5, 8, 2, 1, 4, 9, 3 }, k = 3 
Output : { 4, 9, 3, 8, 5, 8, 2, 1 }

แนวทางแก้ปัญหา

คุณสามารถแก้ได้ง่ายโดยการเลื่อนแต่ละสมาชิกไปทางขวา และทำซ้ำ k ครั้ง แต่จะใช้เวลามาก (Time Complexity O(k × N))

Reversal Algorithm: การกลับอาร์เรย์ (Reverse) และการหมุนอาร์เรย์สามารถทำได้โดยการกลับช่วงของสมาชิก ตามอัลกอริทึมนี้:

  • ขั้นแรก กลับอาร์เรย์ทั้งหมด
  • ปรับ k ด้วย modulus ของ k กับ N (ขนาดอาร์เรย์) เพราะ k อาจมากกว่า N
  • กลับ k สมาชิกแรกของอาร์เรย์เพื่อให้เรียงลำดับถูกต้อง
  • จากนั้นกลับช่วงสมาชิกที่เหลือ คือ จาก k ถึง N-1

ตัวอย่างโค้ด

using namespace std;
#include <bits/stdc++.h>

void reverse(int nums[], int start, int end) {
    int temp = 0;
    // กลับอาร์เรย์ด้วยการสลับ start กับ end
    while (start <= end) {
        temp = nums[end];
        nums[end] = nums[start];
        nums[start] = temp;
        start++;
        end--;
    }
}

int main() {
    int arr[] = {4, 6, 2, 6, 43, 7, 3, 6, 2, 4, 5};
    int N = sizeof(arr) / sizeof(arr[0]);
    int k = 4;
    
    // กลับอาร์เรย์ทั้งหมด
    reverse(arr, 0, N - 1);
    
    k = k % N;
    
    // กลับช่วง 0 ถึง k-1
    reverse(arr, 0, k - 1);
    
    // กลับช่วง k ถึงตัวสุดท้าย
    reverse(arr, k, N - 1);
    
    cout << "Array after rotating by k-elements : ";
    for (int i = 0; i < N; i++)
        cout << arr[i] << " ";
    
    return 0;
}

ผลลัพธ์

Array after rotating by k-elements : 6 2 4 5 4 6 2 6 43 7 3

สรุป

ในบทความนี้ เราอภิบายปัญหาการหมุนอาร์เรย์ไปทางขวา k ตำแหน่งด้วยอัลกอริทึม Reversal อธิบายว่าอัลกอริทึม Reversal คืออะไรและ 어떻게นำไปใช้ เรายังมีโค้ด C++ สำหรับแก้ปัญหานี้ สามารถเขียนในภาษาอื่นได้เช่น C, Java, Python หวังว่าจะเป็นประโยชน์