[자바] 퀵소트(Quick Sort) 란?

프로그래밍 (Programming)

Quick Sort(빠른 정렬;퀵정렬이라 불림)

임의의 Pivot 값을 골라서 Pivot 보다 큰값과 작은 값을 바꾸는 정렬방식으로,
삽입등 바로 옆의 자료와 자리를 변경하지 않기때문에 좀더 효과적이다.

왼쪽에서 오른쪽으로는 P보다 큰 값을 찾고, 오른쪽에서 왼쪽으로는 P보다 작은 값을 찾는다.
그 후 그 값을 바꿔준다. 그리고 왼쪽과 오른쪽의 P가 교차 될경우 마지막에 찾은 가장
작은 값과 맨 앞의 값을 바꾼다. 그 뒤 맨 앞에 있던 값이 옴겨진 자리를 기준으로 나누어서 또 정렬 ...
P 값을 기준으로 왼쪽은 P보다 작은 값들의 집합, 오른쪽은 P보다 큰값 들의 집합이 된다.

아래와 같은 값이 배열에 들어있다고 가정 해서 실습을 보자.

그러면 우선 Pivot(기준)이 되는 숫자를 정하는데 기준이 되는 값은 배열의 맨 왼쪽의 값이 된다.
그리고 Left와 Right부분을 잡게 되는데 처음엔 맨 왼쪽이 Left, 맨 오른쪽이 Right가 된다.

3  5  6  2  1  4

Pivot : 3
Left   : 3
Right : 4

이렇게 초기값이 설정을 한 후
Left  는 Pivot값보다   클 때까지 우측으로 이동한다.
Right는 Pivot값보다 작을때까지 좌측으로 이동한다.

3  5  6  2  1  4

Pivot : 3
Left   : 5
Right : 1

이 될 것이다. 이렇게 되면 Left와 Right의 값을 Swap한다. 그리고 Left는 우측 한칸, Right는 좌측 한칸으로
이동해서 또 위의 같은 조건으로 움직인다.

3  1  6  2  5  4

Pivot : 3
Left   : 6
Right : 2

3  1  2  6  5  4

Pivot : 3
Left   : 6
Right : 2

이렇게 보면 Left의 위치는 4번째고, Right는 3번째 위치를 가리키고 있다.
즉, Left랑 Right가 교차된 상황이다. 그러면 Left랑 Right중 작은 값이랑 Pivot값이랑 Swap을 한다.

2  1  3  6  5  4

이제 한 주기가 돌았다. 

[ 2  1 ]  3  [ 6  5  4 ]

마지막 Swap했던 3을 기준으로 좌측은 3보다 작은 값, 우측은 3보다 큰 값들로 정렬이 되어버렸다.
이제 [ 2  1 ]과 [ 6  5  4 ] 값을 또 위와 같은 방식으로 정렬을 돌려보자.

2  1 ]

Left는 2보다 큰 값이 없으므로 우측 맨 끝으로 간걸로 간주한다.
그러면 Right보다 우측이 있는 즉, 교차 되버린것이다. 그래서 작은 값인 1이랑 Swap된다.

1  2  3  [ 6  5  4 ]

또 교차 되어서 4와 Pivot값인 6과 Swap을 한다.

1  2  3  [ 4  5 ] 6

1  2  3  4  5  6

퀵 소트 정렬이 끝났다.

아직 이해가 잘 안갔을 수도 있으므로 아래의 예를 하나 더 들여보았다.
(아래 예제는 곰팅인간님 블로그에서 가져왔습니다.)

정렬할 값
   [ 26  5  37  1  61  11  59  15  48  19 ]



1차
   [ 26  5  37  1  61  11  59  15  48  19 
   [ 26  5  19  1  61  11  59  15  48  37 ] 
   [ 26  5  19  1  15  11  59  61  48  37 ]
   [ 11  5  19  1  15 ] 26 [ 59  61  48  37 ]

2차
   [ 11  5  19  1  15 ] 26 [ 59  61  48  37 ]
   [ 11 5  1  19  15 ] 26 [ 59  61  48  37 ]
   [ 1  5 ] 11 [ 19  15 ] 26 [ 59  61  48  37 ]

3차
   [ 1  5 ] 11 [ 19  15 ] 26 [ 59  61  48  37 ]
   1  5  11 [ 19  15 ] 26 [ 59  61  48  37 ]
   
4차
   1  5  11 [ 19  15 ] 26 [ 59  61  48  37 ]
   1  5  11  15  19  26 [ 59  61  48  37 ]

5차
   1  5  11  15  19  26 [ 59  61  48  37 ]
   1  5  11  15  19  26 [ 59  37  48 61 ]
   1  5  11  15  19  26 [ 48  37 ] 59 [ 61 ]

6차
   1  5  11  15  19  26 [ 48  37 ] 59 [ 61 ]
   1  5  11  15  19  26  37  48  59 [ 61 ]

7차(완료)
   1  5  11  15  19  26  37  48  59  61





 프로그래밍 배우기 좋은 사이트들 

프로그래밍 (Programming)

Programming IThttp://itguru.tistory.com


개발자의 하루http://devday.tistory.com


PHPSchool - PHP 개발자 커뮤니티http://phpschool.com


KLDP - 리눅스 개발자 커뮤니티http://kldp.org


MSDN 라이브러리http://msdn.microsoft.com/library



최종 업데이트: 2012년 10월 19일 오전 12:25  미국 동부시간.

JAVA의 정석 2nd Edition (연습문제 풀이)


Cover 페이지


JAVA의 정석.pdf


저작권에 문제가 되면 지체마시고 연락주세요!!!

The Java™ Tutorials: Operators

자바강의: 연산자


Operator Precedence

OperatorsPrecedence
postfixexpr++ expr--
unary++expr --expr +expr -expr ~ !
multiplicative* / %
additive+ -
shift<< >> >>>
relational< > <= >= instanceof
equality== !=
bitwise AND&
bitwise exclusive OR^
bitwise inclusive OR|
logical AND&&
logical OR||
ternary? :
assignment= += -= *= /= %= &= ^= |= <<= >>= >>>=

관계연산자 : 두 피연산자 사이의 값을 크기 또는 관계를 비교하는 연산자로서 true, false 로 구분한다.
관계 연산자의 종류는 다음과 같다.

연산자

연산식

설명

A > B

A B보다 크면

>=

A >= B

A B보다 크거나 같으면

A < B

A B보다 작으면

<=

A <= B

A B보다 작거나 같으면

==

A == B

A B 같으면

!=

A != B

A B 다르면

instance of

A instance of B

A B 인스턴스이면


논리연산자 : 두개의 논리값을 평가하여 true, false 의 논리형 결과를 

반환하는 연산자를 말한다.

연산자

연산식

설명

!

!A

A가 거짓(false)이면 (true)

&&

A&&B

A B가 모두 참이면 참
A 거짓이면 B를 평가하지 않음

||

A|| B

A이나 B 둘 중 하나라도 참이면 참
A 참이면 B를 평가하지 않음

&

A & B

A B가 모두 참이면 참
A 거짓이어도 B를 평가함

|

A | B

A이나 B 둘 중 하나라도 참이면 참
A 참이어도 B를 평가함


연산자의 우선 순위는 다음과 같다.

연산자의 수행 시 여러 연산자가 혼용된 경우 연산자의 우선순위에 따라 수행하도록 한다.

1

 ( ), [ ]

2

 ++, --, ~, (+), (-)

3

 *, / ,%

4

 +, -

5

 >>, <<, >>>

6

 <, <=, >=, >

7

 ==, !=

8

 &

9

 ^

10

 |

11

 &&

12

 ||

13

 expr?op1:op2

14

 =, +=,-=, *=, /=, %=

OperatorPurpose
+addition of numbers, concatenation of Strings
+=add and assign numbers, concatenate and assign Strings
-subtraction
-=subtract and assign
*multiplication
*=multiply and assign
/division
/=divide and assign
%take remainder
%=take remainder and assign
++increment by one
--decrement by one
>greater than
>=greater than or equal to
<less than
<=less than or equal to
!boolean NOT
!=not equal to
&&boolean AND
||boolean OR
==boolean equals
=assignment
~bitwise NOT
?:conditional
instanceoftype checking
|bitwise OR
|=bitwise OR and assign
^bitwise XOR
^=bitwise XOR and assign
&bitwise AND
&=bitwise AND and assign
>>shift bits right with sign extension
>>=shift bits right with sign extension and assign
<<shift bits left
<<=shift bits left and assign
>>>unsigned bit shift right
>>>=unsigned bit shift right and assign


참고: 

Operators

Summary of Operators

Java Operators

http://jmonster.springnote.com/

소설같은자북(jabook.com)-소설같은시리즈(Java, C#, C, JSP)





대충 이렇게(??) 생겼습니다.


http://www.jabook.com/




'프로그래밍' 카테고리의 다른 글

[자바] 자바강의: 연산자 / Operators  (0) 2012.07.04
아스키코드 표 (ASCII Code Chart)  (0) 2012.06.21
[자바] JAVA 강의 노트  (0) 2012.06.13
Links  (0) 2011.10.16
알고리즘 사이트 Programming-challenges  (0) 2011.10.16

+ Recent posts