การเรียงลำดับบิตโทนิกคืออัลกอริธึมการเรียงลำดับแบบขนานที่สร้างขึ้นเพื่อการใช้งานที่ดีที่สุดและมีการใช้งานที่เหมาะสมกับฮาร์ดแวร์และอาร์เรย์ตัวประมวลผลแบบขนาน .
ไม่ใช่วิธีที่มีประสิทธิภาพมากที่สุดเมื่อเทียบกับการเรียงลำดับการผสาน แต่เป็นการดีสำหรับการใช้งานแบบคู่ขนาน นี่เป็นเพราะลำดับการเปรียบเทียบที่กำหนดไว้ล่วงหน้าซึ่งทำให้การเปรียบเทียบเป็นอิสระจากข้อมูลที่จะจัดเรียง
เพื่อให้การจัดเรียงแบบ 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