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

Bitonic Sort ใน C ++


การเรียงลำดับบิตโทนิกคืออัลกอริธึมการเรียงลำดับแบบขนานที่สร้างขึ้นเพื่อการใช้งานที่ดีที่สุดและมีการใช้งานที่เหมาะสมกับฮาร์ดแวร์และอาร์เรย์ตัวประมวลผลแบบขนาน .

ไม่ใช่วิธีที่มีประสิทธิภาพมากที่สุดเมื่อเทียบกับการเรียงลำดับการผสาน แต่เป็นการดีสำหรับการใช้งานแบบคู่ขนาน นี่เป็นเพราะลำดับการเปรียบเทียบที่กำหนดไว้ล่วงหน้าซึ่งทำให้การเปรียบเทียบเป็นอิสระจากข้อมูลที่จะจัดเรียง

เพื่อให้การจัดเรียงแบบ bitonic ทำงานได้อย่างมีประสิทธิภาพ จำนวนองค์ประกอบควรอยู่ในประเภทปริมาณเฉพาะ เช่น ลำดับ 2^n .

ส่วนสำคัญอย่างหนึ่งของการเรียงลำดับบิตโทนิกคือลำดับบิตโทนิกซึ่งเป็นลำดับที่องค์ประกอบมีค่า เพิ่มครั้งแรก แล้ว ลดลง .

ซีเควนซ์ไบโทนิค เป็นอาร์เรย์ arr[0 … (n-1)] หากมีค่าดัชนี i ภายในช่วง 0 ถึง n-1 ซึ่งค่าของ arr[i] จะมากที่สุดในอาร์เรย์ กล่าวคือ

arr[0] <= arr[1] … <= arr[i] and arr[i] >= arr[i+1] … >= aar[n-1]

ลักษณะพิเศษของลำดับบิโตนิก −

  • ลำดับ Bitonic สามารถหมุนกลับไปเป็นลำดับ bitonic ได้

  • ลำดับที่มีองค์ประกอบในลำดับที่เพิ่มขึ้นและลดลงคือลำดับบิตโทนิก

การสร้างลำดับบิตโทนิก

สำหรับการสร้างลำดับบิตโทนิก เราจะสร้างสองลำดับย่อย หนึ่งมีองค์ประกอบจากน้อยไปมาก และอีกส่วนหนึ่งมีองค์ประกอบจากมากไปหาน้อย

ตัวอย่างเช่น มาดูลำดับ arr[] และแปลงลำดับต่อไปนี้เป็นลำดับบิตโทนิก

arr[] = {3, 4, 1, 9, 2, 7, 5, 6}

ขั้นแรก เราจะสร้างคู่ขององค์ประกอบ และจากนั้นสร้างลำดับบิตโทนิกของสิ่งเหล่านี้ในลักษณะที่หนึ่งอยู่ในลำดับจากน้อยไปมาก และอีกส่วนหนึ่งอยู่ในลำดับจากมากไปหาน้อยเป็นต้น

สำหรับอาร์เรย์ของเรา มาสร้างคู่ในลำดับบิตโทนิก

arr[] = {(3, 4), (1, 9), (2, 7), (5, 6)}
// creating bitonic sequence pairs…
arr[] = {(3, 4), (9, 1), (2, 7), (6, 5)}

จากนั้นเราจะสร้างคู่ของคู่เหล่านี้ นั่นคือ 4 องค์ประกอบตามลำดับบิโตนิกและเปรียบเทียบองค์ประกอบที่มีระยะทาง 2 [เช่น ฉันกับ i+2].

arr[] = {(3, 4, 9, 1), (2, 7, 6, 5)}

บิตโทนิกจากน้อยไปมากในชุดแรกจะถูกสร้างขึ้นเป็น -

(3, 4, 9, 1) : comparing two distant elements.
(3, 1, 9, 4) : Now, check adjacent elements.
(1, 3, 4, 9) -> ascending bitonic sequence.

บิตโทนิกจากมากไปน้อยในชุดที่สองจะถูกสร้างขึ้นเป็น -

(2, 7, 6, 5) : comparing two distant elements.
(6, 7, 2, 5) : Now, check adjacent elements.
(7, 6, 5, 2) -> descending bitonic sequence.

ในตอนท้ายจะได้ลำดับ bitonic ขนาด 8

1, 3, 4, 9, 7, 6, 5, 2

ตอนนี้ เนื่องจากเราได้เรียนรู้เกี่ยวกับลำดับบิโตนิกแล้ว เราจะรู้เกี่ยวกับ Bitonic Sorting .

การจัดเรียงแบบไบโทนิค

ในการเรียงลำดับลำดับบิตโทนิกโดยใช้การเรียงลำดับบิตโทนิกโดยใช้ขั้นตอนเหล่านี้ -

ขั้นตอนที่ 1 − สร้างลำดับบิตโทนิก

ขั้นตอนที่ 2 − ตอนนี้ เรามีลำดับบิตโทนิกโดยส่วนหนึ่งอยู่ในลำดับที่เพิ่มขึ้นและส่วนอื่นๆ อยู่ในลำดับที่ลดลง

ขั้นตอนที่ 3 − เราจะเปรียบเทียบและสลับองค์ประกอบแรกของทั้งสองส่วน จากนั้นองค์ประกอบที่สอง สาม สี่สำหรับพวกเขา

ขั้นตอนที่ 4 − เราจะเปรียบเทียบและสลับองค์ประกอบทุก ๆ วินาทีของลำดับ

ขั้นตอนที่ 5 − ในที่สุด เราจะเปรียบเทียบและสลับองค์ประกอบที่อยู่ติดกันของลำดับ

ขั้นตอนที่ 6 − หลังจากสลับทั้งหมดแล้ว เราจะได้อาร์เรย์ที่จัดเรียง

ตัวอย่าง

โปรแกรมแสดงการใช้งาน Bitonic Sort −

#include<iostream>
using namespace std;
void bitonicSeqMerge(int a[], int start, int BseqSize, int direction) {
   if (BseqSize>1){
      int k = BseqSize/2;
      for (int i=start; i<start+k; i++)
      if (direction==(a[i]>a[i+k]))
      swap(a[i],a[i+k]);
      bitonicSeqMerge(a, start, k, direction);
      bitonicSeqMerge(a, start+k, k, direction);
   }
}
void bitonicSortrec(int a[],int start, int BseqSize, int direction) {
   if (BseqSize>1){
      int k = BseqSize/2;
      bitonicSortrec(a, start, k, 1);
      bitonicSortrec(a, start+k, k, 0);
      bitonicSeqMerge(a,start, BseqSize, direction);
   }
}
void bitonicSort(int a[], int size, int up) {
   bitonicSortrec(a, 0, size, up);
}
int main() {
   int a[]= {5, 10, 51, 8, 1, 9, 6, 22};
   int size = sizeof(a)/sizeof(a[0]);
   printf("Original array: \n");
   for (int i=0; i<size; i++)
   printf("%d\t", a[i]);
   bitonicSort(a, size, 1);
   printf("\nSorted array: \n");
   for (int i=0; i<size; i++)
   printf("%d\t", a[i]);
   return 0;
}

ผลลัพธ์

Original array:
5 10 51 8 1 9 6 22
Sorted array:
1 5 6 8 9 10 22 51