⚙️ 알고리즘/기타 문제 & 풀이
[C] 퀵정렬을 이용한 몇 번째 작은수
dev_zoe
2020. 8. 1. 01:36
반응형
10개의 난수(100보다 작은)를 발생시키고 몇 번째 작은 수를 찾을 것인가를 입력받은 후 그 수를 출력하는 프로그램을 작성하라.
입력 :
Enter the number of numbers : 10
몇번째로 작은 수 : 4
출력 :
894 250 65 688 99 966 296 649 455 305
4번째로 작은 수는 296
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void init_array(int list[], int n) {
srand(time(NULL));
for (int i = 0; i < n; i++)
*(list + i) = rand() % 100;
}
void print_array(int list[], int n) {
for (int i = 0; i < n; i++)
printf("%3d ", list[i]);
}
void swap(int A[], int i, int j) {
int temp = A[j];
A[j] = A[i];
A[i] = temp;
}
int partition(int A[], int p, int r) { //퀵 정렬의 partition
int i = p - 1;
int j = p;
int pivot = A[r];
while (j < r) {
if (A[j] < pivot) {
swap(A, ++i, j);
}
j++;
}
swap(A, ++i, j);
r = i;
return r;
}
int find(int A[], int p, int r, int orderIndex) {
int q;
if (p <= r) {
q = partition(A, p, r);
if (orderIndex == q)
return A[orderIndex]; //찾으면 그 수 반환
else if (orderIndex < q) //찾고자 하는 수의 인덱스가 partition보다 작으면 왼쪽에서 찾기
find(A, p, q - 1, orderIndex);
else
find(A, q + 1, r, orderIndex); //크면 오른쪽에서 찾기
}
}
int main(void) {
int num, order;
int *list;
printf("Enter the number of numbers: ");
scanf("%d", &num);
printf("몇번째로 작은 수: ");
scanf("%d", &order);
list = (int*)malloc(sizeof(int) * num);
init_array(list, num);
print_array(list, num);
int order_num = find(list, 0, num - 1, order-1);
printf("\n%d번째 작은 수는 : %d\n", order, order_num);
free(list);
}반응형