頭のなかに引っかかったことがあったので
ソートアルゴリズムのおさらいをした。
# バブルソート O (N^2) 安定
void bubble_sort() {
int i, k, tmp;
bool changed = false;
k = 0;
do {
changed = false;
for (int i = 0; i < MAX-1-k; i++) {
if (array[i] > array[i+1]) {
tmp = array[i];
array[i] = array[i+1];
array[i+1] = tmp;
changed = true;
}
}
k++;
} while (changed);
}
# クイックソート O (N^2) ~ O (N log N) 不安定
void quick_sort(int bottom, int top,int data[]) {
if (bottom >= top)
return;
int div = data[bottom];
int lower = bottom;
int upper = top;
int temp;
while (lower < upper) {
while (lower <= upper && data[lower] <= div)
lower += 1;
while (lower <= upper && data[upper] > div)
upper -=1;
if (lower < upper) {
temp = data[lower];
data[lower] = data[upper];
data[upper] = temp;
}
}
temp = data[bottom];
data[bottom] = data[upper];
data[upper] = temp;
quick_sort(bottom, upper-1, data);
quick_sort(upper+1, top, data);
}
# 単純挿入ソート O (N^2) 安定
void insert_sort(int *array) {
int i, sorted, temp, insert;
for (sorted = 0; sorted < MAX - 1; sorted++) {
insert = array[sorted + 1];
for (i = 0; i <= sorted; i++) {
if (array[i] > insert)
break;
}
while (i <= sorted + 1) {
temp = insert;
insert = array[i];
array[i] = temp;
i++;
}
}
}
# コームソート O (N log N) 不安定
void comb_sort(int *array) {
int i, tmp, sorted, gap;
gap = N;
do {
gap = (gap * 10) / 13;
if (gap == 0)
gap = 1;
sorted = true;
for (i = 0; i < N - gap; i++) {
if (array[i] > array[i + gap]) {
sorted = false;
tmp = array[i];
array[i] = array[i + gap];
array[i + gap] = tmp;
}
}
} while((gap > 1) || !sorted);
}
# マージソート O (N log N) 安定
void merge_sort(int n, int* data, int offset) {
if (n < 2)
return;
int i, j, k;
int m = n/2;
merge_sort(m, data, offset);
merge_sort(n-m, data, offset+m);
int buf[m];
for (i = 0; i < m; i++)
buf[i] = data[offset+i];
j = m;
i = k = 0;
while (i < m && j < n) {
if (buf[i] <= data[offset+j]) {
data[offset+k] = buf[i];
i++;
} else {
data[offset+k] = data[offset+j];
j++;
}
k++;
}
while (i < m) {
data[offset+k] = buf[i];
k++;
i++;
}
}
あとはここの辺りを頼りにもう少し
0 件のコメント:
コメントを投稿