#include <iostream>
using namespace std;
bool is_sorted(int arr[], const int N) {
for (int i = 1; i < N; i++)
if (arr[i - 1] > arr[i])
return false;
return true;
}
void BubbleSort0(int arr[], const int N) {
for (int i = 1; i < N; i++)
for (int j = N - 1; j >= i; j--)
if (arr[j - 1] > arr[j])
swap(arr[j - 1], arr[j]);
}
- std::swap() --> swap2() (define 함수) 변경
#define swap2(type, x, y) do { type t = x; x = y; y = t; } while (false)
void BubbleSort1(int arr[], const int N) {
for (int i = 1; i < N; i++)
for (int j = N - 1; j >= i; j--)
if (arr[j - 1] > arr[j])
swap2(int, arr[j - 1], arr[j]);
}
void BubbleSort2(int arr[], const int N) {
for (int i = 1; i < N; i++) {
bool exchg = false;
for (int j = N - 1; j >= i; j--)
if (arr[j - 1] > arr[j]) {
swap2(int, arr[j - 1], arr[j]);
exchg = true;
}
if (!exchg)
break;
}
}
void BubbleSort3(int arr[], const int N) {
int left = 1;
for (int i = left; i < N; i = left) {
left = N;
for (int j = N - 1; j >= i; j--)
if (arr[j - 1] > arr[j]) {
swap2(int, arr[j - 1], arr[j]);
left = j;
}
}
}
- 정렬된 부분은 다음에 생략(왼쪽 끝, 오른쪽 끝), 좌우 교대로 정렬
void BubbleSort4(int arr[], const int N) {
int right = N;
int left = 1;
for (int i = left; i < right; i = left) {
static bool b_toright = true;
if (b_toright) {
int last = N;
for (int j = right - 1; j >= i; j--)
if (arr[j - 1] > arr[j]) {
swap2(int, arr[j - 1], arr[j]);
last = j;
}
left = last;
}
else {
int last = 0;
for (int j = i; j < right; j++)
if (arr[j - 1] > arr[j]) {
swap2(int, arr[j - 1], arr[j]);
last = j;
}
right = last;
}
b_toright = !b_toright;
}
}
- std::swap() 함수를 안쓰면 속도가 훨씬(2배 이상) 빨라진다.
- 1, 2, 3은 차이가 작거나 순위가 변하지만 BubbleSort4는 항상 1등.
int main(int num) {
const int N = RAND_MAX;
int arr[N];
for (int i = 0; i < N; ++i)
arr[i] = rand();
int start = clock();
BubbleSort4(arr, N);
cout << clock() - start << endl;
cout << is_sorted(arr, N) << endl;
}