Quick Sort

ế

 Ý t  Gi ả

ắ ầ a1, a2 ..., aN d a trên vi c ệ ầ

: ngưở i thu t QuickSort s p x p dãy ậ phân ho ch dãy ban đ u thành 3 ph n : ạ ầ ầ ầ

• Ph n 1: G m các ph n t ồ • Ph n 2: G m các ph n t ồ • Ph n 3: G m các ph n t ồ v i x là giá tr c a m t ph n t ị ủ ớ ệ

ộ  Sau khi th c hi n phân ho ch, dãy ban đ u đ ầ c phân thành 3 ầ ử ầ ử ầ ử ầ ử ạ ơ x có giá tr bé h n ị x có giá tr b ng ị ằ có giá tr l n h n ơ x ị ớ tùy ý trong dãy ban đ u. ầ ượ ự

• 1. ak ≤ x , v i k = 1 .. j ớ • 2. ak = x , v i k = j+1 .. i-1 ớ • 3. ak ‡ x , v i k = i..N ớ Ak=x

đo n:ạ

Ak <=x Ak>=x

: đã có th t ạ ế ạ ứ ự

 Đo n th 2 đã có th t ứ  N u các đo n 1 và 3 ch có 1 ph n t à khi đó dãy con ban đ u đã đ c s p. ầ ử ượ ắ

. ứ ự ỉ ầ Ak=x Ak>=x

Ak <=x

. ứ ự

thì dãy ban đ u ch ạ ạ ế ầ ử ầ ỉ

ứ ự

t ti n hành vi c phân ng pháp phân ho ch dãy ban ừ ệ ạ

 Đo n th 2 đã có th t ứ  N u các đo n 1 và 3 có nhi u h n 1 ph n t ơ ề c s p. khi các đo n 1, 3 đ có th t ượ ắ ạ  Đ s p x p các đo n 1 và 3, ta l n l ầ ượ ế ạ ế ể ắ ho ch t ng dãy con theo cùng ph ươ ạ đ u v a trình bày … ầ ừ

Ví Dụ

Cho dãy số a:

12 2 8

5

1

6

4

15

x = a[3] = 5

Phân hoạch đoạn l =0, r = 7:

12

2

8

5

1

6

4

15

l=0

r=7

Ví Dụ

4

2

8

5

1

6

12

15

i = 0

j = 6

l=0

r=7

4

2

8

5

1

6

12

15

i = 1

i = 2

l=0

r=7

j = 3

j = 5

j = 4

Quick Sort – Ví Dụ

Phân hoạch đoạn l = 0, r = 2:

4

2

1

5

8

6

12

15

l = 0

r =3

i = 0

j = 2

Ví Dụ

Phân hoạch đoạn l =4, r = 7:

1

2

4

5

8

6

12

15

r =7

l = 4 i = 4

j = 6

j = 6

j = 7

1

2

4

5

8

12

15

6 i = 4

r =7

l = 4

Ví Dụ

Phân hoạch đoạn l =6, r = 7:

1

2

4

5

6

8

12

15

Ví Dụ

Phân hoạch đọan [0,7]

i 0

1

2

4

5

6

3

j 7

5 5

12

2

8

1

6

4

15

X

right

left

Ví Dụ

Phân hoạch đọan [0,7]

X

5

i 1

2

3

4

j 5

0

6

7

2

8

5

1

6

4

12

15

right

left

Ví Dụ

Phân hoạch đọan [0,2]

1

j 2

3

i 4

5

0

6

7

2

1

5

8

6

4

12

15

right

left

Phân hoạch đọan [0,2]

1 j 2 i 0 3 4 5 6 7

2 2 1 4 5 8 6 12 15

X

right left

Ví Dụ

Phân hoạch đọan [4,7]

0

1

2

3

i 4

6

5

j 7

1

2

4

5

8

12

15

6 6

X

right

left

Ví Dụ

Phân hoạch đọan [5,7]

0

1

2

3

j 4

6

7

i 5

1

2

4

5

6

12

15

8

right

left

Ví Dụ

Phân hoạch đọan[5,7]

0 1 2 3 4 6 j 7 i 5

1 2 4 5 6 12 12 15 8

right left

Ví Dụ

0

1

2

3

4

5

6

7

1

2

4

5

6

8

12

15

Gi

i Thu t Quick Sort

ầ ử

//dãy đã đ K t thúc; : N u ế left ≥ right //dãy có ít h n 2 ph n t ướ  B c 1 ế ơ c s p x p ế

: Phân ho ch dãy ạ ượ ắ aleft … aright thành các đo n: ạ aleft..

ướ  B c 2 aj, aj+1.. ai-1, ai.. aright

Đo n 1 ạ

Đo n 2ạ

Đo n 3: ạ

: S p x p đo n 1 ướ  B c 3 ắ ế

£ x : aj+1.. ai-1 = x ai.. aright ‡ x ạ : aleft.. aj ạ : ai.. aright

: S p x p đo n 3 i Thu t Quick Sort

 B c 4 ướ Gi ả

ắ ế ậ

: Ch n tùy ý m t ph n t a[k] trong dãy là giá tr m c ( l ầ ử ộ ọ ị ố

ướ  B c 1 ≤ k ≤ r):

ướ  B c 2 : Phát hi n và hi u ch nh c p ph n t ệ ầ ử ỉ

x = a[k]; i = l; j = r; ệ a[i], a[j] n m sai ch : ằ ặ ỗ

Swap(a[i],a[j]);

 B c 2a ướ  B c 2b ướ ướ  B c 2c : N u i < j: ế c l Ng ượ ạ

i B c 2. ướ  B c 3

: Trong khi (a[i]x) j--; : N u i< j ế L p l ặ ạ ướ i: D ng ừ

Quick Sort Cài đ tặ void QuickSort(int a[], int left, int right) {

i, j, x;

int x = a[(left+right)/2]; i = left; j = right; do { while(a[i] < x) i++; while(a[j] > x) j--;

if(i <= j)

{

Swap(a[i],a[j]);

i++ ; j--; }

} while(i <= j);

if(left

QuickSort(a, left, j);

if(i

}

QuickSort(a, i, right);