선택 정렬
void selection_sort(int num[], int n){
int i, j, min, temp;
for(i = 0; i < n - 1; i++){
min = i;
for(j = i + 1; j < n; j++){
if(num[j] < num[min])
min = j;
}
temp = num[i];
num[i] = num[min];
num[min] = temp;
print_array(num, n);
}
}
- 선택 정렬(selection sort) : 정렬되지 않은 2개 이상의 원소의 집합에서 최소값을 찾아서 정렬 리스트로 이동
버블 정렬
void bubble_sort(int num[], int n){
int i, j, swap, temp;
for(i = 0; i < n - 1; i++){
swap = 0;
for(j = 0; j < n - 1; j++){
if(num[j] > num[j + 1]){
temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
swap = 1;
}
}
if(swap == 0) break;
print_array(num, n);
}
}
- 버블 정렬(bubble sort) : 항목의 키 값을 풍선에 비유한 것으로 값이 클수록 더 높이 올라감
삽입 정렬
void insertion_sort(int num[], int n){
int i, j, pivot;
for(i = 1; i < n; i++){
pivot = num[i];
for(j = i - 1; j >= 0 && pivot < num[j]; j--)
num[j + 1] = num[j];
num[j + 1] = pivot;
print_array(num, n);
}
}
- 삽입 정렬(insertion sort) : 이미 정렬되어 있는 서브 리스트에 새로운 원소를 추가하는 과정
퀵 정렬
void quicksort(int num[], int left, int right){
int pivot, i, j, temp;
if(left < right){
i = left;
j = right + 1;
pivot = num[left];
do{
do{ i++; } while(num[i] < pivot);
do{ j--; } while(num[j] > pivot);
if(i < j){
temp = num[i];
num[i] = num[j];
num[j] = temp;
print_array(num, 10);
}
} while(i < j);
temp = num[left];
num[left] = num[j];
num[j] = temp;
if(left != j) print_array(num, 10);
quicksort(num, left, j - 1);
quicksort(num, j + 1, right);
}
}
- 퀵 정렬(quick sort) : 임의의 기준 수(pivot) x를 선택해 정렬 대상 수들을 x 값보다 작은 그룹과 큰 그룹으로 분할
힙 정렬
void makeheap(int heap[], int root, int n){
int child, temp;
temp = heap[root];
child = 2 * root;
while(child <= n){
if((child < n) && (heap[child] < heap[child + 1]))
child++;
if(temp > heap[child])
break;
else{
heap[child / 2] = heap[child];
child *= 2;
}
}
heap[child / 2] = temp;
}
void heapsort(int heap[], int n){
int i, temp;
for(i = n / 2; i > 0; i--)
makeheap(heap, i, n);
printheap(heap, 1, n);
for(i = n - 1; i > 0; i--){
temp = heap[1];
heap[1] = heap[i + 1];
heap[i + 1] = temp;
makeheap(heap, 1, i);
printheap(heap, 1, n);
}
}
- 힙 정렬(heap sort) : 이진 트리의 한 종류인 최대 힙을 이용한 정렬 방법
합병 정렬
void mergesort(int num[], int left, int right){
int mid;
if(right > left){
mid = (right + left) / 2;
mergesort(num, left, mid);
mergesort(num, mid + 1, right);
merge(num, left, mid + 1, right);
print_array(num, 9);
}
}
void merge(int num[], int left, int mid, int right){
int i, left_end, num_items, tmp_pos;
int temp[100];
left_end = mid - 1;
tmp_pos = left;
num_items = right - left + 1;
while((left <= left_end) && (mid <= right)){
if(num[left] <= num[mid]){
temp[tmp_pos] = num[left];
tmp_pos = tmp_pos + 1;
left = left + 1;
}
else{
temp[tmp_pos] = num[mid];
tmp_pos = tmp_pos + 1;
mid = mid + 1;
}
}
while(left <= left_end){
temp[tmp_pos] = num[left];
left = left + 1;
tmp_pos = tmp_pos + 1;
}
while(mid <= right){
temp[tmp_pos] = num[mid];
mid = mid + 1;
tmp_pos = tmp_pos + 1;
}
for(i = 0; i < num_items; i++){
num[right] = temp[right];
right = right - 1;
}
}
- 합병 정렬(merge sort) : 레코드 리스트를 반으로 나누어 2개의 서브 리스트로 분할하고 각 서브 리스트에 이 과정을 재귀적으로 적용해 더 이상 분할이 불가능할 때까지 반복