You are on page 1of 34

CHƯƠNG 4:

CÁC PHƯƠNG PHÁP


SẮP XẾP CƠ BẢN
1. Định nghĩa bài toán sắp xếp FR
Giải thuật sắp xếp là cách để sắp xếp dữ liệu theo một thứ tự nào đó.
Sắp xếp theo thứ tự ở đây là sắp xếp theo thứ tự dạng số hoặc thứ tự
dạng chữ cái như trong từ điển.
giải thuật không yêu cầu thêm bất kỳ bộ nhớ phụ, việc
sắp xếp được tiến hành trong chính phần bộ nhớ đã
In-place sorting khai báo trước được gọi là in-place sorting

giải thuật sắp xếp mà chương trình cần thêm lượng


Not-in-place bộ nhớ >= với số phần tử đang được sắp xếp. Các giải
sorting thuật này được gọi là not-in-place sorting
Add a footer 2
1. Định nghĩa bài toán sắp xếp FR
Một giải thuật sắp xếp được gọi là sắp xếp cố định
Giải thuật sắp nếu sau khi tiến hành sắp xếp thì vị trí tương đối
xếp cố định giữa các phần tử bằng nhau không bị thay đổi

Add a footer 3
1. Định nghĩa bài toán sắp xếp FR
Trong quá trình thực hiện giải thuật chúng ta tiến
Giải thuật sắp hành so sánh các khóa và đổi chỗ các phần tử cho
xếp so sánh nhau. Tức là khi đó vị trí tương đối của các phần tử
bằng nhau bị thay đổi

Add a footer 4
1. Định nghĩa bài toán sắp xếp FR
Các khái niệm quan trọng trong giải thuật sắp xếp
Thứ tự tăng: Một dãy giá trị được xem như trong thứ tự tăng dần
nếu phần tử đứng sau lớn hơn phần tử đứng trước.
Ví dụ: 1, 3, 5, 6, 9.

Thứ tự giảm : Một dãy giá trị được xem như trong thứ tự giảm dần
nếu phần tử đứng sau nhỏ hơn phần tử đứng trước.
Ví dụ: 9, 6, 5, 3, 1

Add a footer 5
1. Định nghĩa bài toán sắp xếp FR
Các khái niệm quan trọng trong giải thuật sắp xếp
Thứ tự không tăng : Một dãy giá trị được xem như trong thứ tự
không tăng nếu phần tử đứng sau nhỏ hơn hoặc bằng phần tử đứng
trước.
Ví dụ: 9, 6, 5, 5, 1.

Thứ tự không giảm: Một dãy giá trị được xem như trong thứ tự
không giảm nếu phần tử đứng sau lớn hơn hoặc bằng phần tử đứng
trước.
Ví dụ: 1, 5, 5, 6, 9
Add a footer 6
2. Phương pháp chọn trực tiếp (Selection sort) FR
 Giải thuật dựa trên việc so sánh in-place, trong đó danh sách
được chia thành hai phần, phần được sắp xếp (sorted list) ở bên
trái và phần chưa được sắp xếp (unsorted list) ở bên phải

 Phần tử nhỏ nhất được lựa chọn từ mảng chưa được sắp xếp và
được tráo đổi với phần bên trái nhất và phần tử đó trở thành
phần tử của mảng được sắp xếp
 Tiến trình này tiếp tục cho tới khi toàn bộ từng phần tử trong
mảng chưa được sắp xếp đều được di chuyển sang mảng đã được
sắp xếp.
Add a footer 7
2. Phương pháp chọn trực tiếp FR
 Cách giải thuật sắp xếp chọn làm việc
Ta có:
• Lần lặp 1: từ vị trí đầu tiên tìm toàn bộ danh sách và thấy rằng 10 là
giá trị nhỏ nhất.

Đổi hai giá trị này cho nhau

 Sau lần lặp 1: giá trị nhỏ nhất ở đầu dãy số


Add a footer 8
2. Phương pháp chọn trực tiếp FR
• Lần lặp hai, giá trị 33, chúng ta tiếp tục quét phần còn lại của danh
sách theo thứ tự từng phần tử.

Thấy rằng 14 là giá trị nhỏ nhất

Đổi hai giá trị này.

Sau lần lặp 2, hai giá trị nhỏ nhất đã được đặt tại phần đầu của
danh sách
Add a footer 9
2. Phương pháp chọn trực tiếp FR
• Lần lặp n-1. Ta được

Add a footer 10
2. Phương pháp chọn trực tiếp FR
 Giải thuật cho sắp xếp chọn

Add a footer 11
list : mảng các phần tử FR
n : kích cỡ mảng
for i = 1 tới n - 1
min = i /* thiết lập phần tử hiện tại là min*/
for j = i+1 tới n /* kiểm tra phần tử có là nhỏ nhất
không */
if list[j] < list[min] thì min = j; kết thúc if
kết thúc for
/* tráo đổi phần tử nhỏ nhất với phần tử hiện tại*/
if indexMin != i then tráo đổi list[min] và list[i]
kết thúc if
Add a footer 12
3. Phương pháp chèn trực tiếp (Insertion sort) FR

Sắp xếp chèn là một giải thuật sắp xếp dựa trên so sánh in-
place. Sắp xếp chèn là chèn thêm một phần tử vào danh sách
con đã qua sắp xếp. Phần tử được chèn vào vị trí thích hợp
sao cho vẫn đảm bảo rằng danh sách con đó vẫn sắp theo thứ
tự.

Add a footer 13
3. Phương pháp chèn trực tiếp (Insertion sort) FR
Cách giải thuật sắp xếp chèn thực hiện?
Ta có
• Lần lặp 1: so sánh hai phần tử đầu tiên

Giải thuật thấy 14 và 33 đã sắp xếp tăng dần. Vì vậy 14 trong danh
sách đã được sắp xếp.

Add a footer 14
3. Phương pháp chèn trực tiếp (Insertion sort) FR
• Lần lặp 2: so sánh hai phần tử thứ 2 với thứ 3

Và thấy rằng 33,27 chưa được sắp xếp tăng dần

Giải thuật sắp xếp chèn tráo đổi vị trí của 33 và 27

Đồng thời cũng kiểm tra tất cả phần tử trong danh sách con đã sắp xếp, ta
thấy phần tử 14 và 27 đã sắp xếp tang do vậy danh sách con vẫn giữ nguyên
Addsau
a footerkhi đã tráo đổi. 15
3. Phương pháp chèn trực tiếp (Insertion sort) FR
• Lần lặp 3: so sánh hai phần tử 33 với 10

Hai giá trị này không theo thứ tự. Vì thế chúng ta tráo đổi chúng.

Ta thấy 27 và 10 không theo thứ tự. Vì thế chúng ta cũng tráo đổi chúng.

Lại thấy 14 và 10 không theo thứ tự. tiếp tục tráo đổi hai số này
sau vòng lặp thứ 3 chúng ta có
Add a footer 16
3. Phương pháp chèn trực tiếp (Insertion sort) FR
Tiến trình trên sẽ tiếp tục diễn ra cho tới khi tất cả giá trị chưa được sắp xếp
được sắp xếp hết vào trong danh sách con đã qua sắp xếp.

Add a footer 17
3. Phương pháp chèn trực tiếp (Insertion sort) FR
Giải thuật sắp xếp chèn (Insertion Sort)

Add a footer 18
A : mảng phần tử
FR
int holePosition
int valueToInsert
for i = 1 tới length(A) thực hiện: /* chọn một giá trị để chèn */
valueToInsert = A[i]
holePosition = i
/*xác định vị trí cho phần tử được chèn */
while holePosition > 0 và A[holePosition-1] > valueToInsert thực hiện:
A[holePosition] = A[holePosition-1]
holePosition = holePosition -1
kết thúc while
A[holePosition] = valueToInsert /* chèn giá trị tại vị trí trên */
kết thúc for
Add a footer 19
4.Phương pháp nổi bọt (Bubble sort) FR
• Giải thuật sắp xếp này được tiến hành dựa trên việc so sánh cặp
phần tử liền kề nhau và tráo đổi thứ tự nếu chúng không theo thứ
tự.
• Giải thuật sắp xếp nổi bọt là giải thuật chậm nhất trong số các giải
thuật sắp xếp cơ bản. Giải thuật này còn chậm hơn giải thuật đổi
chỗ trực tiếp mặc dù số lần so sánh bằng nhau, nhưng do đổi chỗ
hai phần tử kề nhau nên số lần đổi chỗ nhiều hơn.

Add a footer 20
4.Phương pháp nổi bọt (Bubble sort) FR
Cách giải thuật sắp xếp nổi bọt làm việc?

Ta có
Lần lặp 1:
• so sánh 2 phần tử đầu tiên kiểm tra
xem phần tử nào lớn hơn, 33 > 14, do
đó hai phần tử này đã theo thứ tự
• so sánh 33 > 27
33 > 27, hai giá trị này cần được tráo đổi
thứ tự.
Add a footer 21
4.Phương pháp nổi bọt (Bubble sort) FR
• so sánh 33 và 35. Hai giá trị này đã
theo thứ tự.
• so sánh hai giá trị kế tiếp là 35 và 10.
Vì 10 < 35. Tráo đổi thứ tự hai giá trị

Lần lặp 2:

Lần lặp 3:

Lần lặp 4:
Add a footer 22
4.Phương pháp nổi bọt (Bubble sort) FR
Giải thuật cho sắp xếp nổi bọt (Bubble Sort)

Add a footer 23
Bắt đầu hàm bubbleSort( list : mảng các phần tử )
FR
loop = list.count;
for i = 0 tới loop-1 thực hiện:
swapped = false
for j = 0 tới loop-1 thực hiện:
  if list[j] > list[j+1] then /* so sánh các phần tử cạnh nhau */
swap( list[j], list[j+1] ) /* tráo đổi chúng */
4. Phương pháp nổi bọt (Bubble sort)
swapped = true
kết thúc if
kết thúc for
/*Nếu không cần tráo đổi phần tử nào nữa thì thoát khỏi vòng lặp.*/
if(not swapped) then break
kết thúc if
kết thúc for
Add a footer 24
5. Phương pháp sắp xếp nhanh (Quick sort) FR

• Giải thuật sắp xếp nhanh chia mảng thành hai phần bằng cách so
sánh từng phần tử của mảng với một phần tử được chọn gọi là
phần tử chốt (Pivot)
• Một mảng bao gồm các phần tử nhỏ hơn hoặc bằng phần tử chốt
và mảng còn lại bao gồm các phần tử lớn hơn hoặc bằng phần tử
chốt.

Add a footer 25
5. Phương pháp sắp xếp nhanh (Quick sort) FR
Cách chọn phần tử chốt:
- Chọn phần tử đứng đầu hoặc đứng cuối làm phần tử chốt.
- Chọn phần tử đứng giữa danh sách làm phần tử chốt.

- Chọn phần tử trung vị trong ba phần tử đứng đầu, đứng


giữa và đứng cuối làm phần tử chốt.

Add a footer 26
5. Phương pháp sắp xếp nhanh (Quick sort) FR
 Minh họa giải thuật sắp xếp nhanh (Quick Sort)
7 -2 4 1 6 5 0 -4 2 Pivot
<2 >=2
-2 1 0 -4 Pivot 7 4 6 5 Pivot
<5 >=5
>=-4
-2 1 0 Pivot 4 7 6 Pivot
<0 >=0 >=6
-2 1 7

Add a footer 27
5. Phương pháp sắp xếp nhanh (Quick sort) FR
Giải thuật mẫu cho Sắp xếp nhanh
Bắt đầu hàm quickSort(left, right)
if right-left <= 0
return
else
pivot = A[right]
partition = partitionFunc(left, right, pivot)
quickSort(left,partition-1)
quickSort(partition+1,right)
kết thúc if
Add a footer Kết thúc hàm 28
6.Phương pháp sắp xếp trộn (Merge sort) FR
Sắp xếp trộn (Merge Sort) là một giải thuật sắp xếp dựa trên giải thuật
chia để trị, sau đó kết hợp chúng lại với nhau thành một mảng đã
được sắp xếp.

Add a footer 29
6.Phương pháp sắp xếp trộn (Merge sort) FR
Cách giải thuật sắp xếp trộn (Merge Sort) làm việc
Ta có
- Chia mảng kích cỡ 8 thành hai mảng kích cỡ 4

- Tiếp tục chia các mảng này thành 2 nửa

Add a footer 30
6.Phương pháp sắp xếp trộn (Merge sort) FR
- Tiến hành chia tiếp cho tới khi không còn chia được
nữa.

- So sánh hai phần tử trong mỗi list và sau đó tổ hợp chúng vào trong
một list khác theo cách thức đã được sắp xếp
Vòng lặp 1: 14 và 33 là trong các vị trí đã được sắp xếp
27 và 10, 27 > 10 nên đặt 10 ở đầu và sau đó là 27
35 và 19, 35 > 19 nên đặt 19 ở đầu và sau đó là 35
42 và 44 là trong các vị trí đã được sắp xếp

Add a footer 31
6.Phương pháp sắp xếp trộn (Merge sort) FR

Vòng lặp 2:
kết hợp từng cặp list một ở trên. Chúng ta so sánh các giá trị và sau đó
hợp nhất chúng lại vào trong một list chứa 4 giá trị, và 4 giá trị này
đều đã được sắp thứ tự.

Vòng lặp n:

Add a footer 32
6.Phương pháp sắp xếp trộn (Merge sort) FR
Giải thuật mẫu cho Sắp xếp nhanh

Bước 1</b>: Nếu chỉ có một phần tử trong list thì list này được
xem như là đã được sắp xếp. Trả về list hay giá trị nào đó.

Bước 2</b>: Chia list một cách đệ qui thành hai nửa cho tới khi
không thể chia được nữa.

Bước 3</b>: Kết hợp các list nhỏ hơn (đã qua sắp xếp) thành list
mới (cũng đã được sắp xếp).
Add a footer 33
Thank You.
FR
FABRIKAM RESIDENCES
Angelica Astrom
208 555 0164
angelica@fabrikamresidences.com
www.fabrikamresidences.com

You might also like