※ 이 글은 chatGPT를 기반으로 작성한 글입니다.
① 홀짝 정렬은 배열을 오름차순으로 정렬하는 병렬 정렬 알고리즘이다.
㉠ 홀짝 정렬은 브릭 정렬(brick sort)이라고도 알려져있다.
② 홀짝 정렬은 분할 정복 전략(devide-and-conquer strategy)를 사용하는 병합 정렬을 기반으로 한다.
③ 홀짝 정렬의 기본 원리는 다음과 같다.
㉠ 홀수 인덱스의 인접한 두 요소를 비교한다.
㉡ 순서가 잘못되어 있으면 순서를 바꾼다.
㉢ 짝수 인덱스에 대해서 ㉠ ㉡을 시행한다.
㉣ 정렬이 완료될 때까지 ㉠ ㉡ ㉢를 반복한다.




④ 홀짝 정렬의 의사 코드(psuedo code)는 다음과 같다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function oddEvenSort(array) | |
n = length(array) | |
sorted = false | |
while not sorted do | |
sorted = true | |
for i = 1 to n-1 step 2 do | |
if array[i] > array[i+1] then | |
swap(array[i], array[i+1]) | |
sorted = false | |
end if | |
end for | |
for i = 0 to n-1 step 2 do | |
if array[i] > array[i+1] then | |
swap(array[i], array[i+1]) | |
sorted = false | |
end if | |
end for | |
end while | |
return array | |
end function |
⑤ 비교적 구현이 매우 간단하지만, 최악의 경우 시간 복잡도가 O(n^2)인 정렬이다.
⑥ 홀짝 정렬의 구현 코드는 다음과 같다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<iostream> | |
#include<vector> | |
#include<algorithm> | |
#include<chrono> | |
using namespace std; | |
using namespace chrono; | |
vector<int>randomVector(int n) { | |
vector<int> vec(n); | |
srand(time(NULL)); | |
for (int i = 0; i < n; i++) { | |
vec[i] = rand() % 100; | |
} | |
return vec; | |
} | |
void oddEvenSort(int n) { | |
vector<int>vec = randomVector(n); | |
bool sorted = false; | |
auto tik = chrono::system_clock::now(); | |
while (!sorted) { | |
sorted = true; | |
for (int i = 1; i < n - 1; i += 2) { | |
if (vec[i] > vec[i + 1]) { | |
swap(vec[i], vec[i + 1]); | |
sorted = false; | |
} | |
} | |
for (int i = 0; i < n - 1; i += 2) { | |
if (vec[i] > vec[i + 1]) { | |
swap(vec[i], vec[i + 1]); | |
sorted = false; | |
} | |
} | |
} | |
auto tok = chrono::system_clock::now(); | |
cout << endl; | |
cout << n << ":" << chrono::duration_cast<microseconds>(tok - tik).count() << "ms \n"; | |
} | |
int main() { | |
oddEvenSort(10); | |
oddEvenSort(100); | |
oddEvenSort(1000); | |
oddEvenSort(10000); | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
10:0ms | |
100:7ms | |
1000:322ms | |
10000:28839ms |
⑦ 홀짝 정렬은 병렬화가 가능하다.
㉠ 여러 개의 하위 스택으로 분할한 뒤 여러 개의 프로세서 또는 쓰레드로 홀짝 정렬을 수행할 수 있다.
홀짝 병합 정렬
※ 이 글은 chatGPT를 기반으로 작성한 글입니다.
hemahero.tistory.com
'All about Data Structure & Algorithm > 심화' 카테고리의 다른 글
라빈 카프 알고리즘 (0) | 2023.04.18 |
---|---|
보이어 무어 알고리즘(Boyer moore) (0) | 2023.04.18 |
향상된 퀵 정렬 (0) | 2023.03.24 |
셸 정렬(Shell Sort) (0) | 2023.03.24 |
분할 정복(Divide and conquer) (2) | 2023.03.15 |