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

โปรแกรม C/C++ สำหรับ Count Inversions ในอาร์เรย์โดยใช้ Merge Sort?


จำนวนการผกผันที่เกิดขึ้นเพื่อเรียงลำดับอาร์เรย์ที่กำหนดเรียกว่าการนับผกผัน ปัญหาการผกผันเป็นปัญหาคลาสสิกที่สามารถแก้ไขได้โดยใช้อัลกอริทึมการเรียงลำดับการผสาน ในปัญหานี้ v เราจะนับองค์ประกอบทั้งหมดมากกว่าทางด้านซ้ายและเพิ่มจำนวนไปยังผลลัพธ์ ThisLogic เสร็จสิ้นภายในฟังก์ชันผสานของการเรียงลำดับการผสาน

เพื่อให้เข้าใจหัวข้อได้ดีขึ้น เรามาดูตัวอย่างกัน ให้เราพิจารณาสองอาร์เรย์ย่อยที่เกี่ยวข้องกับกระบวนการผสาน -

โปรแกรม C/C++ สำหรับ Count Inversions ในอาร์เรย์โดยใช้ Merge Sort?

โปรแกรม C/C++ สำหรับ Count Inversions ในอาร์เรย์โดยใช้ Merge Sort?

โปรแกรม C/C++ สำหรับ Count Inversions ในอาร์เรย์โดยใช้ Merge Sort?

โปรแกรม C/C++ สำหรับ Count Inversions ในอาร์เรย์โดยใช้ Merge Sort?

โปรแกรม C/C++ สำหรับ Count Inversions ในอาร์เรย์โดยใช้ Merge Sort?

โปรแกรม C/C++ สำหรับ Count Inversions ในอาร์เรย์โดยใช้ Merge Sort?

Input: arr[] = { 1, 9, 6, 4, 5}
Output: Inversion count is 5

คำอธิบาย

จำนวนผกผันของอาร์เรย์

จากอาร์เรย์ ให้หาจำนวนการผกผันของอาร์เรย์นั้น ถ้า (i A[j]) ดังนั้นคู่ (i, j) จะถูกเรียกว่าการผกผันของอาร์เรย์ A เราจำเป็นต้องนับคู่ดังกล่าวทั้งหมดใน arr

ตัวอย่างเช่น

ในอาร์เรย์มีการผกผัน 5 ครั้ง

(9,6), (9,4), (9,5), (6,4), (6,5)

1. เปรียบเทียบค่าขององค์ประกอบซึ่งกันและกัน

2. เพิ่มตัวนับหากค่าที่ดัชนีล่างสูงกว่า

3. แสดงผล

ตัวอย่าง

#include <stdio.h>
int Merge(int arr[], int aux[], int low, int mid, int high) {
   int k = low, i = low, j = mid + 1;
   int inversionCount = 0;
   while (i <= mid && j <= high) {
      if (arr[i] <= arr[j]) {
         aux[k++] = arr[i++];
      } else {
         aux[k++] = arr[j++];
         inversionCount += (mid - i + 1); // NOTE
      }
   }
   while (i <= mid)
   aux[k++] = arr[i++];
   for (int i = low; i <= high; i++)
      arr[i] = aux[i];
   return inversionCount;
}
int MergeSort(int arr[], int aux[], int low, int high) {
   if (high == low) // if run size == 1
      return 0;
   int mid = (low + ((high - low) >> 1));
   int inversionCount = 0;
   inversionCount += MergeSort(arr, aux, low, mid);
   inversionCount += MergeSort(arr, aux, mid + 1, high);
   inversionCount += Merge(arr, aux, low, mid, high);
   return inversionCount;
}
int main() {
   int arr[] = { 1, 9, 6, 4, 5 };
   int N = 5;
   int aux[N];
   for (int i = 0; i < N; i++)
      aux[i] = arr[i];
   printf("Inversion count is %d", MergeSort(arr, aux, 0, N - 1));
   return 0;
}