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

ค้นหาการเรียงสับเปลี่ยนที่ทำให้เกิดกรณีที่เลวร้ายที่สุดของ Merge Sort ใน C++


สมมติว่าเรามีชุดขององค์ประกอบ เราต้องค้นหาว่าการเรียงสับเปลี่ยนขององค์ประกอบใดจะส่งผลให้เกิดกรณีที่เลวร้ายที่สุดของ Merge Sort? ตามที่เราทราบอย่างไม่มีอาการ การเรียงลำดับการผสานจะใช้เวลา O (n บันทึก n) เสมอ แต่บางกรณีจำเป็นต้องมีการเปรียบเทียบมากขึ้นและใช้เวลามากขึ้น ที่นี่เราต้องค้นหาการเปลี่ยนแปลงขององค์ประกอบอินพุตซึ่งจะต้องมีการเปรียบเทียบจำนวนมากขึ้นเมื่อทำการจัดเรียงโดยใช้อัลกอริธึม Merge Sort ทั่วไป

ดังนั้นหากอินพุตเป็น [11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26] ผลลัพธ์จะเป็น [11,19 ,15,23,13,21,17,25,12,20,16,24,14,22,18,26].

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดฟังก์ชัน merge() ซึ่งจะใช้ array arr, array left, array right, l_index, m_index, r_index,
  • สำหรับการเริ่มต้น i :=0 เมื่อ i <=m_index - l_index อัปเดต (เพิ่ม i โดย 1) ทำ −
    • arr[i] :=left[i]
  • สำหรับการเริ่มต้น j :=0 เมื่อ j
  • arr[i + j] =ถูกต้อง[j]
  • กำหนดฟังก์ชัน divide() ซึ่งจะนำอาร์เรย์ arr, อาร์เรย์ซ้าย, อาร์เรย์ขวา, l_index, m_index, r_index,
  • สำหรับการเริ่มต้น i :=0 เมื่อ i <=m_index - l_index อัปเดต (เพิ่ม i โดย 1) ทำ −
    • left[i] :=arr[i * 2]
  • สำหรับการเริ่มต้น i :=0 เมื่อฉัน
  • right[i] :=arr[i * 2 + 1]
  • กำหนดฟังก์ชัน gen_worst_seq() ซึ่งจะใช้อาร์เรย์ arr[], l_index, r_index,
  • ถ้า l_index
  • m_index :=l_index + (r_index - l_index) / 2
  • กำหนดอาร์เรย์ทางซ้ายของขนาด:m_index-l_index+1
  • กำหนดขนาดอาร์เรย์ที่ถูกต้อง:r_index-m_index
  • แบ่ง (arr, ซ้าย, ขวา, l_index, m_index, r_index)
  • gen_worst_seq(ซ้าย l_index, m_index)
  • gen_worst_seq(ขวา, m_index + 1, r_index)
  • ผสาน (arr, ซ้าย, ขวา, l_index, m_index, r_index)
  • ตัวอย่าง

    ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

    #include <bits/stdc++.h>
    using namespace std;
    void display(int A[], int size) {
       for (int i = 0; i < size; i++)
          cout << A[i] << " ";
       cout << endl;
    }
    int merge(int arr[], int left[], int right[],int l_index, int m_index, int r_index) {
       int i;
       for (i = 0; i <= m_index - l_index; i++)
          arr[i] = left[i];
       for (int j = 0; j < r_index - m_index; j++)
          arr[i + j] = right[j];
    }
    int divide(int arr[], int left[], int right[], int l_index, int m_index, int r_index) {
       for (int i = 0; i <= m_index - l_index; i++)
          left[i] = arr[i * 2];
       for (int i = 0; i < r_index - m_index; i++)
          right[i] = arr[i * 2 + 1];
    }
    int gen_worst_seq(int arr[], int l_index, int r_index) {
       if (l_index < r_index) {
          int m_index = l_index + (r_index - l_index) / 2;
          int left[m_index - l_index + 1];
          int right[r_index - m_index];
          divide(arr, left, right, l_index, m_index, r_index);
          gen_worst_seq(left, l_index, m_index);
          gen_worst_seq(right, m_index + 1, r_index);
          merge(arr, left, right, l_index, m_index, r_index);
       }
    }
    int main() {
       int arr[] = {11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26};
       int n = sizeof(arr) / sizeof(arr[0]);
       gen_worst_seq(arr, 0, n - 1);
       display(arr, n);
    }

    อินพุต

    11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26

    ผลลัพธ์

    11 19 15 23 13 21 17 25 12 20 16 24 14 22 18 26