Vienna
7일차 본문
오늘은 알고리즘 말고 유니티를 계속 마저할까 했는데
(유니티 교과서는 진짜 짧다. 벌써 4챕터 밖에 안 남았다 아마 정말 기초만 담았나보다.)
알고리즘은 하루 건너뛰면 왠지 빨리 잊을 것 같기도하고... 퀵 정렬이 꽤 재밌어서 빨리 그 다음 내용도 공부하고 싶어서 오늘도 알고리즘을 공부하기로 했다. 오늘도 화이팅!
1. 실습_6-9
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define swap(type,x,y) do{type t=x;x=y;y=t;}while(0)
void Quick(int a[], int left, int right) {
int pl = left;
int pr = right;
int x = a[(pl+pr) / 2]; // 피벗
do {
while (a[pl] < x) pl++;
while (a[pr] > x) pr--;
if (pl <= pr) {
swap(int, a[pl], a[pr]);
pl++;
pr--;
}
} while (pl <= pr);
if (left < pr) Quick(a, left, pr);
if (pl < right) Quick(a, pl, right);
}
int main() {
int i, nx;
int* x;
puts("배열을 나눕니다.");
printf("요소 개수: ");
scanf("%d", &nx);
x = (int*)calloc(nx, sizeof(int));
for (i = 0; i < nx; i++) {
printf("x[%d]: ", i);
scanf("%d", &x[i]);
}
Quick(x, 0, nx - 1);
puts("오름차순으로 정렬했습니다.");
for (i = 0; i < nx; i++)
printf("x[%d] = %d\n", i, x[i]);
free(x);
return 0;
}
2. (Q13) 아래 형식으로 동작하는 quick_sort 함수를 구현하세요. 두 번째 매개변수인 n은 요소의 개수입니다.
void quick_sort(int a[], int n);
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define swap(type,x,y) do{type t=x;x=y;y=t;}while(0)
void Quick(int a[], int left, int right) {
int pl = left;
int pr = right;
int x = a[(pl + pr) / 2]; // 피벗
do {
while (a[pl] < x) pl++;
while (a[pr] > x) pr--;
if (pl <= pr) {
swap(int, a[pl], a[pr]);
pl++;
pr--;
}
} while (pl <= pr);
if (left < pr) Quick(a, left, pr);
if (pl < right) Quick(a, pl, right);
}
void Quick_sort(int a[], int n) {
Quick(a, 0, n - 1);
}
// 이런 함수는 왜 만들라고 한 거지...?
// 파라미터를 하나 덜 쓰는 함수가 쓰고 싶어서?
// 아니면 n-1처리를 놓치지 않는지 확인하려고?
int main() {
int i, nx;
int* x;
puts("배열을 나눕니다.");
printf("요소 개수: ");
scanf("%d", &nx);
x = (int*)calloc(nx, sizeof(int));
for (i = 0; i < nx; i++) {
printf("x[%d]: ", i);
scanf("%d", &x[i]);
}
Quick_sort(x, nx);
// 생각해보면 매개변수가 줄었고 -1처리를 여기서 안 하니 나중에 코드해석할 때 헷갈리지 않고 좋은 것 같기도.
puts("오름차순으로 정렬했습니다.");
for (i = 0; i < nx; i++)
printf("x[%d] = %d\n", i, x[i]);
free(x);
return 0;
}
정답:
///*--- 퀵 정렬 ---*/
//void quick(int a[], int left, int right)
//{
// int pl = left; /* 왼쪽 커서 */
// int pr = right; /* 오른쪽 커서 */
// int x = a[(pl + pr) / 2]; /* 피벗(가운데 요소 선택) */
//
// do {
// while (a[pl] < x) pl++;
// while (a[pr] > x) pr--;
// if (pl <= pr) {
// swap(int, a[pl], a[pr]);
// pl++;
// pr--;
// }
// } while (pl <= pr);
//
// if (left < pr) quick(a, left, pr);
// if (pl < right) quick(a, pl, right);
//}
//
///*--- 퀵 정렬(배열, 요솟수) ---*/
//void quick_sort(int a[], int n)
//{
// quick(a, 0, n - 1);
//}
3. 보충_6C-1
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define swap(type,x,y) do{type t=x;x=y;y=t;}while(0)
void Quick(int a[], int left, int right) {
int pl = left;
int pr = right;
int x = a[(pl + pr) / 2]; // 피벗
printf("a[%d]~[%d]: {", left, right);
for (int i = left; i < right; i++)
printf("%d, ", a[i]);
printf("%d}\n", a[right]);
do {
while (a[pl] < x) pl++;
while (a[pr] > x) pr--;
if (pl <= pr) {
swap(int, a[pl], a[pr]);
pl++;
pr--;
}
} while (pl <= pr);
if (left < pr) Quick(a, left, pr);
if (pl < right) Quick(a, pl, right);
}
int main() {
int i, nx;
int* x;
puts("배열을 나눕니다.");
printf("요소 개수: ");
scanf("%d", &nx);
x = (int*)calloc(nx, sizeof(int));
for (i = 0; i < nx; i++) {
printf("x[%d]: ", i);
scanf("%d", &x[i]);
}
Quick(x, 0, nx - 1);
puts("오름차순으로 정렬했습니다.");
for (i = 0; i < nx; i++)
printf("x[%d] = %d\n", i, x[i]);
free(x);
return 0;
}
4. 실습_6-10
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include "IntStack.h"
#define swap(type,x,y) do{type t=x;x=y;y=t;}while(0)
void Quick(int a[], int left, int right) {
IntStack lstack;
IntStack rstack;
Initialize(&lstack, right - left + 1);
Initialize(&rstack, right - left + 1);
Push(&lstack, left);
Push(&rstack, right);
while (!IsEmpty(&lstack)) {
int pl = (Pop(&lstack, &left), left);
int pr = (Pop(&rstack, &right), right);
int x = a[(left + right) / 2];
do {
while (a[pl] < x) pl++;
while (a[pr] > x) pr--;
if (pl <= pr) {
swap(int, a[pl], a[pr]);
pl++;
pr--;
}
} while (pl <= pr);
if (left < pr) {
Push(&lstack, left);
Push(&rstack, pr);
}
if (pl< right) {
Push(&lstack, pl);
Push(&rstack, right);
}
}
Terminate(&lstack);
Terminate(&rstack);
}
int main() {
int i, nx;
int* x;
puts("배열을 나눕니다.");
printf("요소 개수: ");
scanf("%d", &nx);
x = (int*)calloc(nx, sizeof(int));
for (i = 0; i < nx; i++) {
printf("x[%d]: ", i);
scanf("%d", &x[i]);
}
Quick(x, 0, nx - 1);
puts("오름차순으로 정렬했습니다.");
for (i = 0; i < nx; i++)
printf("x[%d] = %d\n", i, x[i]);
free(x);
return 0;
}
'알고리즘 문제 풀이 > Do It! 자료구조와 함께 배우는 알고리즘 입문 C언어 편' 카테고리의 다른 글
06-8) 힙 정렬 (0) | 2023.05.13 |
---|---|
6일차 (0) | 2021.11.25 |
5일차 (5) (0) | 2021.11.24 |
5일차 (4) (0) | 2021.11.23 |
5일차 (3) (0) | 2021.11.23 |
Comments