#include <stdio.h>
int N, M, n[100001];
int mid(int a, int b, int c){
if (n[a] > n[b]&& n[a] < n[c])return a;
if (n[b] > n[a]&& n[b] < n[c])return b;
return c;
}
int q_sort_up(int s, int e){
if (s >= e)return 0;
int l = mid(s, e, (s + e) / 2);
int L = n[l], T = s, i, temp;
temp = n[l]; n[l] = n[e]; n[e] = temp;
for (i = s; i < e; i++){
if (L >= n[i]){
temp = n[T]; n[T] = n[i]; n[i] = temp;
T++;
}
}
if (L < n[T]){
temp = n[T]; n[T] = n[e]; n[e] = temp;
}
if (s < T){
q_sort_up(s, T);
}
if (T + 1 < e){
q_sort_up(T + 1, e);
}
}
int q_sort_down(int s, int e){
if (s >= e)return 0;
int l = mid(s, e, (s + e) / 2);
int L = n[l], T = s, i, temp;
temp = n[l]; n[l] = n[e]; n[e] = temp;
for (i = s; i < e; i++){
if (L <= n[i]){
temp = n[T]; n[T] = n[i]; n[i] = temp;
T++;
}
}
if (L > n[T]){
temp = n[T]; n[T] = n[e]; n[e] = temp;
}
if (s < T){
q_sort_down(s, T);
}
if (T + 1 < e){
q_sort_down(T + 1, e);
}
}
int main(void)
{
int i, j;
scanf("%d %d", &N, &M);
for (i = 0; i < N; i++){
scanf("%d", &n[i]);
}
if (M==0)q_sort_up(0, N - 1);
else q_sort_down(0, N - 1);
for (i = 0; i < N; i++){
printf("%d\n", n[i]);
}
}
머 다른 소스보고 할수도 있는데 이렇게 계속 반갈이 하면서 재귀호출하면 절대 스택이 터질리가없는데
숫자 최대 100000 입력돼 봣자 log100000 번 호출되는거 아닌가
mid 선택 부터 성능에 관해 다시 생각해보렴. 조건이 중복됨.
그리고 up down 을 다시 만들 필요가 있었을까?
좋은 퀵소트 모델 많은데 왜 이상하게 접근할까.
아 그러네 그건 내가 멍청한거 인정함
근데 이상하게 접근한다는게 이해가 안가네 위키에 잇는 소스나 내가 만든소스나 결국 기준하나 잡고 양쪽으로 나누는건데
두루뭉술하게 말하면 그렇지. 아주 사소한데서 문제가 생김.
피벗을 옮기는거 하나만 해도 네가 정확한 위치에 놓지 못하면 나머지 논리가 다 무너지는게 퀵소트 알고리즘이지 뭐.
아 그러네 ㅋㅋ 감사 ㅋ