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

วิธีการ

เราตรวจสอบวิธีรับอินพุตตัวพิมพ์เล็กที่สุดสำหรับการเรียงลำดับการรวมสำหรับชุดอินพุตหรือไม่

ตอนนี้เราพยายามสร้างอาร์เรย์จากล่างขึ้นบน

ตอนนี้ให้อาร์เรย์ที่จัดเรียงเป็น {11, 12, 13, 14, 15, 16, 17, 18}

ในตอนนี้ เพื่อสร้างกรณีที่เลวร้ายที่สุดของการเรียงลำดับการผสาน การดำเนินการผสานที่ส่งผลให้อาร์เรย์ที่เรียงลำดับข้างต้นควรส่งผลให้เกิดการเปรียบเทียบมากที่สุด ด้วยเหตุนี้ อาร์เรย์ย่อยด้านซ้ายและขวาที่เกี่ยวข้องกับการดำเนินการผสานควรเก็บองค์ประกอบสำรองของ sortedarray ดังกล่าว ซึ่งอาร์เรย์ย่อยด้านซ้ายควรเป็น {11, 13, 15, 17} และอาร์เรย์ย่อยด้านขวาควรเป็น {12, 14 , 16, 18}. ดังนั้นทุกองค์ประกอบของอาร์เรย์จะถูกเปรียบเทียบขั้นต่ำหนึ่งครั้งและนั่นจะส่งผลให้มีการเปรียบเทียบสูงสุด ตอนนี้เราใช้ตรรกะเดียวกันสำหรับอาร์เรย์ย่อยด้านซ้ายและขวาด้วย สำหรับอาร์เรย์ {11, 13, 15, 17} กรณีที่เลวร้ายที่สุดคือเมื่ออาร์เรย์ย่อยด้านซ้ายและขวาของมันคือ{11, 15} และ {13, 17} ตามลำดับ และสำหรับอาร์เรย์ {12, 14, 16, 18} กรณีที่เลวร้ายที่สุดจะเกิดขึ้นสำหรับ {12, 14} และ {16, 18}

อัลกอริทึมที่สมบูรณ์

GenerateWorstCase(arr[])

  • ตอนนี้เราสร้างอาร์เรย์เสริมสองชุดด้านซ้ายและขวาและเก็บองค์ประกอบอาร์เรย์สำรองไว้

  • เราเรียก GenerateWorstCase สำหรับอาร์เรย์ย่อยด้านซ้าย − GenerateWorstCase (ซ้าย)

  • เราเรียก GenerateWorstCase สำหรับอาร์เรย์ย่อยด้านขวา GenerateWorstCase (ขวา)

  • ตอนนี้เราคัดลอกองค์ประกอบทั้งหมดของอาร์เรย์ย่อยด้านซ้ายและขวากลับไปที่อาร์เรย์ดั้งเดิม

ตัวอย่าง

// C program to generate Worst Case of Merge Sort
#include <stdlib.h>
#include <stdio.h>
// Indicates function to print an array
void printArray(int A1[], int size1){
   for (int i = 0; i < size1; i++)
      printf("%d ", A1[i]);
   printf("\n");
}
// Indicates function to join left and right subarray
int join(int arr1[], int left1[], int right1[],
int l1, int m1, int r1){
   int i; // So used in second loop
   for (i = 0; i <= m1 - l1; i++)
      arr1[i] = left1[i];
   for (int j = 0; j < r1 - m1; j++)
      arr1[i + j] = right1[j];
}
// Indicates function to store alternate elemets in left
// and right subarray
int split(int arr1[], int left1[], int right1[],
int l1, int m1, int r1){
   for (int i = 0; i <= m1 - l1; i++)
      left1[i] = arr1[i * 2];
   for (int i = 0; i < r1 - m1; i++)
      right1[i] = arr1[i * 2 + 1];
}
// Indicates function to generate Worst Case of Merge Sort
int generateWorstCase(int arr1[], int l1, int r1){
   if (l1 < r1){
      int m1 = l1 + (r1 - l1) / 2;
      // creating two auxillary arrays
      int left1[m1 - l1 + 1];
      int right1[r1 - m1];
      // Storing alternate array elements in left
      // and right subarray
      split(arr1, left1, right1, l1, m1, r1);
      // Recursing first and second halves
      generateWorstCase(left1, l1, m1);
      generateWorstCase(right1, m1 + 1, r1);
      // joining left and right subarray
      join(arr1, left1, right1, l1, m1, r1);
   }
}
// Driver code
int main(){
   // Initializes sorted array
   int arr1[] = { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26 };
   int n1 = sizeof(arr1) / sizeof(arr1[0]);
   printf("Sorted array is \n");
   printArray(arr1, n1);
   // generating worst Case of Merge Sort
   generateWorstCase(arr1, 0, n1 - 1);
   printf("\nInput array that will result in " "worst case of merge sort is \n");
   printArray(arr1, n1);
   return 0;
}

ผลลัพธ์

Sorted array is
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
Input array that will result in worst case of merge sort is
11 19 15 23 13 21 17 25 12 20 16 24 14 22 18 26