Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 바이토닉 정렬


바이토닉 정렬은 최상의 구현을 위해 생성된 병렬 정렬 알고리즘이며 하드웨어 및 병렬 프로세서 어레이와 함께 최적으로 사용됩니다. .

병합 정렬과 비교할 때 가장 효과적인 것은 아닙니다. 그러나 병렬 구현에는 좋습니다. 이는 정렬할 데이터와 독립적으로 비교를 수행하는 미리 정의된 비교 순서 때문입니다.

바이토닉 ​​정렬이 효과적으로 작동하려면 요소 수는 특정 유형의 수량(예:2^n 순서)이어야 합니다. .

bitonic 정렬의 주요 부분 중 하나는 요소 값이 먼저 증가하는 시퀀스인 bitonic 시퀀스입니다. 그런 다음 감소 .

바이토닉 시퀀스 0에서 n-1 사이의 인덱스 값 i가 있는 경우 배열 arr[0 … (n-1)]입니다. arr[i]의 값이 배열에서 가장 큰 경우. 즉

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

바이토닉 시퀀스의 특징 -

  • Bitonic 시퀀스는 Bitonic 시퀀스로 다시 회전할 수 있습니다.

  • 오름차순과 내림차순으로 요소가 있는 시퀀스를 비트 시퀀스(bitonic sequence)라고 합니다.

바이토닉 시퀀스 생성

바이토닉 ​​시퀀스를 생성하기 위해 오름차순 요소와 내림차순 요소가 있는 두 개의 하위 시퀀스를 만듭니다.

예를 들어, arr[] 시퀀스를 보고 다음 시퀀스를 비트 시퀀스로 변환해 보겠습니다.

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

먼저 요소 쌍을 만든 다음 하나는 오름차순으로, 다른 하나는 내림차순으로 하는 방식으로 이들의 비트 시퀀스를 생성합니다.

배열의 경우 비트 순서로 쌍을 생성해 보겠습니다.

arr[] ={(3, 4), (1, 9), (2, 7), (5, 6)}// 비트 시퀀스 쌍 생성…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) :멀리 떨어진 두 요소를 비교합니다.(3, 1, 9, 4) :이제 인접한 요소를 확인합니다.(1, 3, 4, 9) -> 오름차순 bitonic 시퀀스. 

두 번째 세트의 내림차순 bitonic은 다음과 같이 생성됩니다. -

(2, 7, 6, 5) :멀리 떨어진 두 요소를 비교합니다.(6, 7, 2, 5) :이제 인접한 요소를 확인합니다.(7, 6, 5, 2) -> 내림차순 bitonic 시퀀스. 

마지막에 크기가 8인 bitonic 시퀀스를 얻습니다.

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

이제 우리는 bitonic sequence에 대해 배웠습니다. Bitonic Sorting에 대해 알아보겠습니다. .

바이토닉 정렬

다음 단계를 사용하여 bitonic 정렬을 사용하여 bitonic 시퀀스를 정렬하려면 -

1단계 - 바이토닉 시퀀스를 생성합니다.

2단계 − 이제 한 부분은 오름차순으로 다른 부분은 내림차순으로 구성된 비트 시퀀스가 ​​있습니다.

3단계 - 우리는 양쪽 반쪽의 첫 번째 요소를 비교하고 교환할 것입니다. 그런 다음 두 번째, 세 번째, 네 번째 요소입니다.

4단계 − 시퀀스의 모든 두 번째 요소를 비교하고 교환합니다.

5단계 − 마지막으로 시퀀스의 인접한 요소를 비교하고 교환합니다.

6단계 − 모든 교환 후에 정렬된 배열을 얻습니다.

예시

Bitonic Sort의 구현을 보여주는 프로그램 -

#include 네임스페이스 사용 std;void bitonicSeqMerge(int a[], int start, int BseqSize, int 방향) { if (BseqSize>1){ int k =BseqSize/2; for (int i=start; ia[i+k])) swap(a[i],a[i+k]); bitonicSeqMerge(a, 시작, k, 방향); bitonicSeqMerge(a, 시작+k, k, 방향); }} 무효 bitonicSortrec(int a[],int 시작, int BseqSize, int 방향) { if (BseqSize>1){ int k =BseqSize/2; bitonicSortrec(a, 시작, k, 1); bitonicSortrec(a, 시작+k, k, 0); bitonicSeqMerge(a, 시작, BseqSize, 방향); }} 무효 bitonicSort(int a[], int size, int up) { bitonicSortrec(a, 0, size, up);}int main() { int a[]={5, 10, 51, 8, 1, 9, 6, 22}; 정수 크기 =sizeof(a)/sizeof(a[0]); printf("원래 배열:\n"); for (int i=0; i<크기; i++) printf("%d\t", a[i]); bitonicSort(a, 크기, 1); printf("\n정렬된 배열:\n"); for (int i=0; i<크기; i++) printf("%d\t", a[i]); 반환 0;}

출력

원래 배열:5 10 51 8 1 9 6 22정렬 배열:1 5 6 8 9 10 22 51