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

ผสานการเรียงลำดับโดยใช้มัลติเธรดใน C ++


เราได้รับอาร์เรย์จำนวนเต็มที่ไม่เรียงลำดับ งานคือการจัดเรียงอาร์เรย์โดยใช้เทคนิคการเรียงลำดับแบบผสานที่ดำเนินการผ่าน Multi-threading

ผสานการเรียงลำดับ

Merge sort เป็นเทคนิคการจัดเรียงตามเทคนิคการหารและพิชิต โดยที่เราแบ่งอาร์เรย์ออกเป็นครึ่งหนึ่งเท่าๆ กัน แล้วรวมเข้าด้วยกันในลักษณะที่จัดเรียง

อัลกอริธึมในการใช้งานการเรียงลำดับการผสานคือ

  • ตรวจสอบว่ามีองค์ประกอบอยู่ในรายการแล้วส่งคืนองค์ประกอบหรือไม่

  • มิฉะนั้น ให้แบ่งข้อมูลซ้ำเป็นสองส่วนจนกว่าจะแบ่งไม่ได้

  • สุดท้าย รวมรายการที่มีขนาดเล็กลงในรายการใหม่ตามลำดับ

มัลติเธรดดิ้ง

ในระบบปฏิบัติการ กระทู้ เป็นกระบวนการที่มีน้ำหนักเบาซึ่งมีหน้าที่ในการดำเนินการในส่วนของงาน เธรดแบ่งปันทรัพยากรร่วมกันเพื่อดำเนินงานพร้อมกัน

มัลติเธรด คือการใช้งานมัลติทาสกิ้ง โดยเราสามารถเรียกใช้หลายเธรดบนโปรเซสเซอร์เดียวเพื่อทำงานพร้อมกันได้ มันแบ่งย่อยการดำเนินการเฉพาะภายในแอปพลิเคชันเดียวออกเป็นแต่ละเธรด แต่ละเธรดสามารถทำงานพร้อมกันได้

ตัวอย่าง-:

ใน −int arr[] ={3, 2, 1, 10, 8, 5, 7, 9, 4}

ออก −เรียงลำดับอาร์เรย์คือ:1, 2, 3, 4, 5, 7, 8, 9, 10

คำอธิบาย −เราได้รับอาร์เรย์ที่ไม่เรียงลำดับที่มีค่าจำนวนเต็ม ตอนนี้เราจะจัดเรียงอาร์เรย์โดยใช้การเรียงลำดับผสานกับมัลติเธรด

ใน −int arr[] ={5, 3, 1, 45, 32, 21, 50}

ออก −เรียงลำดับอาร์เรย์คือ:1, 3, 5, 21, 32, 45, 50

คำอธิบาย −เราได้รับอาร์เรย์ที่ไม่เรียงลำดับที่มีค่าจำนวนเต็ม ตอนนี้เราจะจัดเรียงอาร์เรย์โดยใช้การเรียงลำดับผสานกับมัลติเธรด

แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้ −

  • เราจะเริ่มต้นด้วยการสร้างตัวเลขสุ่มโดยใช้วิธี rand() ใน C++ STL

  • สร้างอาร์เรย์ประเภท pthread_t เช่น P_TH[thread_size]

  • เริ่มวนรอบ FOR จาก i ถึง 0 จนถึง i น้อยกว่าขนาดของเธรด ภายในลูป ให้เรียกเมธอด pthread_create(&P_TH[i], NULL, Sorting_Threading, (void*)NULL) เพื่อสร้างเธรดด้วยค่าอาร์เรย์ที่กำหนด

  • ฟังก์ชันการเรียกเป็น combine_array(0, (ขนาด / 2 - 1) / 2, ขนาด / 2 - 1), combine_array(ขนาด / 2, ขนาด/2 + (ขนาด-1-ขนาด/2)/2, ขนาด - 1) และ combine_array(0, (ขนาด - 1)/2, ขนาด - 1)

  • พิมพ์อาร์เรย์ที่จัดเรียงที่เก็บไว้ใน arr[] ของประเภทจำนวนเต็ม

  • ภายในฟังก์ชัน void* Sorting_Threading(void* arg)

    • ประกาศตัวแปรเป็น set_val ถึง temp_val++, first to set_val * (size / 4), end to (set_val + 1) * (size / 4) - 1 และ mid_val ถึง first + (end - first) / 2

    • ตรวจสอบว่า IF น้อยกว่า end ก่อน จากนั้นเรียก Sorting_Threading(first, mid_val), Sorting_Threading(mid_val + 1, end) และ combine_array(first, mid_val, end);

  • ภายในฟังก์ชัน void Sorting_Threading(int first, int end)

    • ประกาศตัวแปรเป็น mid_val ถึง first + (end - first) / 2

    • ตรวจสอบว่า IF น้อยกว่า end ก่อน จากนั้นเรียก Sorting_Threading(first, mid_val), Sorting_Threading(mid_val + 1, end) และ combine_array(first, mid_val, end)

  • ภายในฟังก์ชัน void combine_array(int first, int mid_val, int end)

    • ประกาศตัวแปรเป็น int* เริ่มต้นเป็น int ใหม่[mid_val - first + 1], int* อยู่หลัง int ใหม่[end - mid_val], temp_1 ถึง mid_val - แรก + 1, temp_2 ถึงสิ้นสุด - mid_val, i, j, k เป็นอันดับแรก .

    • เริ่มวนซ้ำ FOR จาก i ถึง 0 จนถึง i น้อยกว่า temp_1 ภายในลูป ตั้งค่า start[i] เป็น arr[i + first].

    • เริ่มวนซ้ำ FOR จาก i ถึง 0 จนถึง i น้อยกว่า temp_2 ภายในลูป ตั้งค่า Last[i] เป็น arr[i + mid_val + 1]

    • ตั้งค่า i เป็น j เป็น 0 เริ่มวนรอบ ขณะที่ i น้อยกว่า temp_1 และ j น้อยกว่า temp_2 ในระหว่างนี้ ให้ตรวจสอบ IF start[i] less than last[j] จากนั้นตั้งค่า arr[k++] เป็น start[i++] มิฉะนั้น ให้ตั้งค่า arr[k++] =สุดท้าย[j++]

    • เริ่มในขณะที่ฉันน้อยกว่า temp_1 จากนั้นตั้งค่า arr[k++] =start[i++] เริ่มในขณะที่ j น้อยกว่า temp_2 จากนั้นตั้งค่า arr[k++] เป็น [j++]

ตัวอย่าง

#include <iostream>
#include <pthread.h>
#include <time.h>
#define size 20
#define thread_size 4
using namespace std;
int arr[size];
int temp_val = 0;
void combine_array(int first, int mid_val, int end){
   int* start = new int[mid_val - first + 1];
   int* last = new int[end - mid_val];
   int temp_1 = mid_val - first + 1;
   int temp_2 = end - mid_val;
   int i, j;
   int k = first;
   for(i = 0; i < temp_1; i++){
      start[i] = arr[i + first];
   }
   for (i = 0; i < temp_2; i++){
      last[i] = arr[i + mid_val + 1];
   }
   i = j = 0;
   while(i < temp_1 && j < temp_2){
      if(start[i] <= last[j]){
         arr[k++] = start[i++];
      }
      else{
         arr[k++] = last[j++];
      }
   }
   while (i < temp_1){
      arr[k++] = start[i++];
   }
   while (j < temp_2){
      arr[k++] = last[j++];
   }
}
void Sorting_Threading(int first, int end){
   int mid_val = first + (end - first) / 2;
   if(first < end){
      Sorting_Threading(first, mid_val);
      Sorting_Threading(mid_val + 1, end);
      combine_array(first, mid_val, end);
   }
}
void* Sorting_Threading(void* arg){
   int set_val = temp_val++;
   int first = set_val * (size / 4);
   int end = (set_val + 1) * (size / 4) - 1;
   int mid_val = first + (end - first) / 2;
   if (first < end){
      Sorting_Threading(first, mid_val);
      Sorting_Threading(mid_val + 1, end);
      combine_array(first, mid_val, end);
   }
}
int main(){
   for(int i = 0; i < size; i++){
      arr[i] = rand() % 100;
   }
   pthread_t P_TH[thread_size];
   for(int i = 0; i < thread_size; i++){
      pthread_create(&P_TH[i], NULL, Sorting_Threading, (void*)NULL);
   }
   for(int i = 0; i < 4; i++){
      pthread_join(P_TH[i], NULL);
   }
   combine_array(0, (size / 2 - 1) / 2, size / 2 - 1);
   combine_array(size / 2, size/2 + (size-1-size/2)/2, size - 1);
   combine_array(0, (size - 1)/2, size - 1);
   cout<<"Merge Sort using Multi-threading: ";
   for (int i = 0; i < size; i++){
      cout << arr[i] << " ";
   }
   return 0;
}

ผลลัพธ์

หากเรารันโค้ดด้านบน มันจะสร้างผลลัพธ์ต่อไปนี้

Merge Sort using Multi-threading: 15 21 26 26 27 35 36 40 49 59 62 63 72 77 83 86 86 90 92 93