퀵소트 질문드립니다
이리온
질문 제목 : quick sort
퀵소트 비재귀질문 내용 :
#include windows.h
#include stdio.h
#include stdlib.h
#include time.h
#include malloc.h
#define ary_size 20
#define init_stack (top = -1)
#define is_stack_empty (top 0)
#define pop (stack[top--])
#define peek (stack[top])
#define push(data) (stack[++top] = (data))void quick(int *ary, int size);int top;
int stack[ary_size];
int main(int argc, char **argv)
{
int start = gettickcount();
int a[ary_size],i;
srand((unsigned int)time(null));
for(i = 0; i sizeof(a)/sizeof(a[0]); i++) a[i] = rand()%30;
printf(before : );
for(i = 0; i sizeof(a)/sizeof(a[0]); i++) printf(%d ,a[i]);
quick(a,sizeof(a)/sizeof(a[0]));
printf(\n\nafter : );
for(i = 0; i sizeof(a)/sizeof(a[0]); i++) printf(%d ,a[i]);
printf(\n\nstart-time : %.3lf\n,start/1000.0);
printf(end-time : %.3lf\n,gettickcount()/1000.0);
printf(run-time : %.3lf\n,(gettickcount() - start)/1000.0);
}void quick(int *ary, int size)
{
int pivot,buf;
int i,j;
int l,r; //스택에 저장할 구간의 정보
init_stack;
l = 0; //배열의처음
r = size - 1; //배열의마지막
push(r);
//printf(\n1번째 푸시값 : %d\n,: %d\n,peek);
push(l);
//printf(2번째 푸시값 : %d\n,peek); while(!is_stack_empty)
{
l = pop; //배열의맨앞
//setconsoletextattribute( getstdhandle( std_output_handle ),14);
//printf(1번째 팝값 : %d\n,l);
r = pop; //배열의맨뒤
//setconsoletextattribute( getstdhandle( std_output_handle ),10);
//printf(2번째 팝값 : %d\n,r);
//setconsoletextattribute( getstdhandle( std_output_handle ),7);
if(r-l+1 1) //r-1+1 == 배열(구간)의 사이즈
{
pivot = ary[r]; //pivot은 배열의맨뒤값
i = l - 1; //i = -1 - 맨앞부터 탐색
j = r; //배열의 맨뒤부터 탐색
while(1) //분할
{
while(ary[++i] pivot);
while(ary[--j] pivot);
if(i = j) break; //i와j가 같거나 교차함
//--swap--피봇값을 중심으로 큰값과 작은값을 교환
buf = ary[i];
ary[i] = ary[j];
ary[j] = buf;
//--swap--
}
//--swap-- 맨뒤의 피봇과 피봇이들어가야할자리의값을 교환
buf = ary[i];
ary[i] = ary[r];
ary[r] = buf;
//--swap--
push(r);
//printf(3번째 푸시값 : %d\n,peek);
push(i+1);
//printf(4번째 푸시값 : %d\n,peek);
push(i-1);
//printf(5번째 푸시값 : %d\n,peek);
push(l);
//printf(6번째 푸시값 : %d\n,peek);
}
}
}퀵소트를 재귀함수사용하지않고 하는방법입니다...
여기서 사용되는 푸시와 팝.. 이걸왜 사용하고 어떤용도로 어떤의미로 사용되는지 전혀감이안오네요..알려주셨으면합니다.
-
심플포텐
아직잘 이해는 가지않습니다만 많은 도움이됬습니다!! 감사합니다!
-
Isolation
좌측부분의 끝값, 우측부분의 끝값은 새로운 Pivot값을 의미합니다.
-
데이비드
피벗값을 바꾼후 좌측부분(피벗기준 작은값) 우측부분(피벗기준 큰값) 으로 값이 나뉩니다.
이때 좌측부분의 제일 처음값(피벗기준 작은값 중 제일 작은 값)과
좌측부분의 제일 끝 값(피벗기준 작은값 중 제일 큰 값)을 가지고 다시 정렬을 해야합니다.
즉, 피벗값의 위치가 바뀔 때마다 좌측 부분과 우측 부분으로 나뉜다.
이 때, 좌측 부분에서의 처음 값과 끝 값
우측 부분에서의 처음 값과 끝 값을 갖기 위해서
Pop과 Pus -
동생몬
감사합니다.. 근데 푸시랑 팝이여기서 어떤작용을하는지 알려쥬새요.. 마지막부분에 푸시4개연속으로사용된부분이 제일 궁금합니다..
-
외국녀
으음... 오프라인으로 설명을 드리면 좀 이해가 되실 수 있을지 모르겠지만,,,
온라인이다 보니 간단하게 말씀드려보겠습니다.
재귀함수를 사용할 경우
함수1 - 함수2 - 함수3 호출되었을 때,
함수3 - 함수2 - 함수1 순서로 return값을 받게 됩니다.
이 때 return값이 Stack구조와 같이 LIFO(즉, 후입선출)
방식으로 데이터를 사용하기 때문에 Push와 Pop이 사용되게 됩니다.
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2694069 | unsigned 질문입니다. | 힘차 | 2025-05-07 |
2694012 | 전공 비전공자 개발자 (10) | 말글 | 2025-05-07 |
2693984 | 오버로딩이 무엇인가요? (2) | 헛매질 | 2025-05-07 |
2693956 | PlaySound재생이 안됩니다!(C에 음악넣기) | 지존 | 2025-05-06 |
2693928 | &와 *의 사용에 관한 명확한 이해 | 제나 | 2025-05-06 |
2693903 | 반복문 설명좀요 ㅠㅠ (2) | 란새 | 2025-05-06 |
2693869 | stdio.h 는 왜 쓰는건가요? (1) | 큰꽃들 | 2025-05-06 |
2693842 | 포인터 변수의 주소값끼리 더하는 것에 대해서 질문드립니다. (1) | 진솔 | 2025-05-05 |
2693811 | 소수 출력;;;; | 화이트캣 | 2025-05-05 |
2693788 | 이런 함수는 없나요? (3) | 앤드류 | 2025-05-05 |
2693758 | txt파일 불러와서 행렬로 저장 | 큰애 | 2025-05-05 |
2693727 | scanf 오류 문제!! (2) | 큰나래 | 2025-05-04 |
2693704 | 구조체 주소록 문제인데 도와주세요 (2) | 도1도캣 | 2025-05-04 |
2693676 | 열혈강의 c언어 질문입니다 | 하양이 | 2025-05-04 |
2693647 | 12.620000 을요 12.620 으로 어떻게 표현해요? (2) | 파도 | 2025-05-04 |
2693619 | 타이틀 코드.. | 단순드립 | 2025-05-03 |
2693591 | 컴파일 에러에서 질문드립니다 (3) | 게자리 | 2025-05-03 |
2693463 | 동적할당 이용시 fwrite사용을 어떻게 해야하나요..? (10) | 일본어못해요 | 2025-05-02 |
2693387 | 배열문제입니다 수정오류캡쳐했습니다 (6) | 연하얀 | 2025-05-01 |
2693356 | text 입출력 내림차순 질문입니다 ㅠ | 빛글 | 2025-05-01 |