chương 2 tÌm kiẾm & sẮ p xẾ -...
TRANSCRIPT
1
2.1. Các giải thuật tìm kiếm
2.1.1. Bài toán tìm kiếm
2.1.2. Giải thuật tìm kiếm tuyến tính
2.1.3. Giải thuật Tìm kiếm nhị phân
2.2. Các giải thuật sắp xếp
2.2.1. Bài toán sắp xếp
3.2.1 Giải thuật đổi chổ trực tiếp –Interchange Sort
3.2.2 Giải thuật chọn trực tiếp-Selection Sort
3.2.3 Giải thuật chèn trực tiếp-Insert Sort
3.2.4 Giải thuật nổi bọt – Bubble Sort
3.2.5 Giải thuật nhanh – Quick Sort
2.3. Bài tập
Chương 2
TÌM KIẾM & SẮP XẾP
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
2
2.1 CÁC GIẢI THUẬT TÌM KIẾM
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
2.1.1. Bài toán tìm kiếm
2.1.2. Giải thuật tìm kiếm tuyến tính
2.1.3. Giải thuật Tìm kiếm nhị phân
3
2.1.1 BÀI TOÁN TÌM KIẾM
Trong thực tế, khi thao tác, khai thác dữ liệu hầu như
lúc nào cũng phải thực hiện thao tác tìm kiếm.
Kết quả của việc tìm kiếm có thể là không tìm thấy
hoặc tìm thấy.
Nếu kết quả là tìm thấy thì nhiều khi còn phải xác định
xem vị trí của phần tử tìm thấy là ở đâu?
Việc tìm kiếm nhanh hay chậm tùy thuộc vào trạng thái
và trật tự của dữ liệu trên đó.
Có 2 thuật toán chính: Tìm kiếm tuyến tính & Tìm kiếm
nhị phân
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
4
Giả sử chúng ta có một mảng M gồm N phần tử.
Vấn đề đặt ra là có hay không phần tử có giá trị bằng X
trong mảng M?
Nếu có thì phần tử có giá trị bằng X là phần tử thứ mấy
trong mảng M?
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
2.1.1 BÀI TOÁN TÌM KIẾM
5
2.1.2. GIẢI THUẬT TÌM KIẾM TUYẾN TÍNH
Ý Tưởng:
Tiến hành so sánh x với phần tử thứ nhất, thứ hai…của
mảng A cho đến khi gặp được phần tử có khóa cần tìm,
hoặc đã tìm hết mảng mà không thấy x.
Ưu điểm: Thuật toán này có thể cho ta thực hiện tìm
kiếm khi các phần tử trong mảng chưa được sắp xếp.
Nhược điểm: Sẽ mất rất nhiều thời gian nếu như
không có phần tử chúng ta cần tìm.
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
6
VD:Tìm x = 14
12 3 5 1 14 9 0 10 2 7 14
14
Chưa
hết
mảng
Tìm thấy
tại vị trí thứ
5
1 2 3 4 5 6 7 8 9 10
12 3 5 1 14 9 0 10 2 7
VD:Tìm x = 30
30
Chưa
hết
mảng
1 2 3 4 5 6 7 8 9 10
Minh Họa
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
2.1.2. GIẢI THUẬT TÌM KIẾM TUYẾN TÍNH
7
Giải thuật:
Bước 1 :
i = 1; // Bắt đầu từ phần tử đầu tiên của dãy
Bước 2 : So sánh a[i] với x, có 2 khả năng.
• a[i] = x ; // Tìm thấy.Dừng
• a[i] != x ; // Thực hiện bước 3.
Bước 3 :
• i = i+1; // xét phần tử kế tiếp trong mảng.
• Nếu i > N // Hết mảng.Không tìm thấy.Dừng
Ngược lại: Lặp lại bước 2.
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
2.1.2. GIẢI THUẬT TÌM KIẾM TUYẾN TÍNH
8
Cài Đặt
Int Timtuyentinh (int a[] , int N , int x)
{
int i = 0;
while((i < N) && (a[i] != x))
i++;
if( i == N)
return -1 ; // tìm hết mảng nhưng không có x
else
return i ; //a[i] là phần tử có khóa x.
}
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
Đánh giá giải thuật
Độ phức tập tính toán cấp n: T(n)=O(n)
2.1.2. GIẢI THUẬT TÌM KIẾM TUYẾN TÍNH
9
2.1.3 GIẢI THUẬT TÌM KIẾM NHỊ PHÂN
Ý Tưởng:
- Lần tìm kiếm ban đầu là phần tử đầu tiên của dãy
(First = 1) đến phần tử cuối cùng của dãy (Last = N).
- So sánh giá trị X với giá trị phần tử đứng ở giữa
của dãy M là M[Mid].
- Nếu X = M[Mid]: Tìm thấy
- Nếu X < M[Mid]: Rút ngắn phạm vi tìm kiếm
về nửa đầu của dãy M (Last = Mid–1)
- Nếu X > M[Mid]: Rút ngắn phạm vi tìm kiếm
về nửa sau của dãy M (First = Mid+1)
- Lặp lại quá trình này cho đến khi tìm thấy phần tử
có giá trị X hoặc phạm vi tìm kiếm không còn nữa
(First > Last).
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
10
Ưu điểm: Thuật toán tìm nhị phân sẽ rút ngắn đáng
kể thời gian tìm kiếm.
Nhược điểm: Chỉ thực hiện được trên dãy đã có thứ
tự.
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
2.1.3 GIẢI THUẬT TÌM KIẾM NHỊ PHÂN
1 12 34 46 23 59 69 77
11
Minh Họa
59 90 85 69 77 7 12 34 46 23
L
Tìm giá trị X = 85 (Tìm thấy)
M
X
Mid = 5
M[mid]= 46
X > M[mid]
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
F
2.1.3 GIẢI THUẬT TÌM KIẾM NHỊ PHÂN
7 12 34 46 23 59 69 77
12
Minh Họa
59 90 85 69 77
Tìm giá trị X = 85 (Tìm thấy)
M
X
Mid = 8
M[mid] = 77
X > M[mid]
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
F L
2.1.3 GIẢI THUẬT TÌM KIẾM NHỊ PHÂN
7 12 34 46 23 59 69 77
13
Minh Họa
90 85
Tìm giá trị X = 85 (Tìm thấy)
Đã tìm
thấy tại
vị trí 9
M
X
Mid = 9
M[mid] = 85
X = M[mid]
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
L F
2.1.3 GIẢI THUẬT TÌM KIẾM NHỊ PHÂN
Minh Họa
Tìm kiếm phần tử có giá trị X = 5 (tìm thấy):
Lần
lặp First Last
First>L
ast Mid M[Mid]
X=
M[Mid]
X<
M[Mid]
X>
M[Mid]
B.đầu 1 10 False 5 8 False True False
1 1 4 False 2 3 False False True
2 3 4 False 3 4 False False True
3 4 4 False 4 5 True
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
Giả sử dãy M gồm 10 phần tử có khóa như sau (N = 10).
2 3 4 5 8 15 17 22 25 30
14
2.1.3 GIẢI THUẬT TÌM KIẾM NHỊ PHÂN
Minh Họa
Tìm kiếm phần tử có giá trị X = 7 (không tìm thấy)
Lần
lặp First Last
First>
Last Mid M[Mid]
X=
M[Mid]
X<
M[Mid]
X>
M[Mid]
B.đầu 1 10 False 5 8 False True False
1 1 4 False 2 3 False False True
2 3 4 False 3 4 False False True
3 4 4 False 4 5 False False True
4 5 4 True
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
Giả sử dãy M gồm 10 phần tử có khóa như sau (N=10).
1 3 4 5 8 15 17 22 25 30
15
2.1.3 GIẢI THUẬT TÌM KIẾM NHỊ PHÂN
16
Giải thuật:
B1: First = 1
B2: Last = N
B3: IF (First > Last)
B3.1: Không tìm thấy
B3.2: Thực hiện Bkt
B4: Mid = (First + Last)/ 2
B5: IF (X = M[Mid])
B5.1: Tìm thấy tại vị trí Mid
B5.2: Thực hiện Bkt
B6: IF (X < M[Mid])
B6.1: Last = Mid – 1
B6.2: Lặp lại B3
B7: IF (X > M[Mid])
B7.1: First = Mid + 1
B7.2: Lặp lại B3
Bkt: Kết thúc © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
2.1.3 GIẢI THUẬT TÌM KIẾM NHỊ PHÂN
17
Cài Đặt int Timnhiphan(int M[ ], int N, int X){
int First = 1; int Last = N;
while (First <= Last){
int Mid = (First + Last)/2;
if (X == M[Mid])
return Mid;
if (X < M[Mid])
Last = Mid – 1;
else
First = Mid + 1;
}
return -1;
}
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
Đánh giá giải thuật
Độ phức tập tính toán cấp n: T(n)=O(Log2n)
2.1.3 GIẢI THUẬT TÌM KIẾM NHỊ PHÂN
18
2.2 CÁC GIẢI THUẬT SẮP XẾP
© Dương Thành Phết-www.thayphet.net
2.2.1. Bài toán sắp xếp
2.2.2. Giải thuật đổi chổ trực tiếp –Interchange Sort
2.2.3. Giải thuật chọn trực tiếp-Selection Sort
2.2.4. Giải thuật chèn trực tiếp-Insert Sort
2.2.5. Giải thuật nổi bọt – Bubble Sort
2.2.6. Giải thuật nhanh – Quick Sort
Khoa CNTT Trường TC TÂY NAM Á
19
2.2.1. BÀI TOÁN SẮP XẾP
Để thuận tiện và giảm thiểu thời gian thao tác mà đặc
biệt là để tìm kiếm, sắp xếp dữ liệu là một trong những
thao tác cần thiết và thường gặp trong quá trình lưu trữ,
quản lý dữ liệu.
Sắp xếp là quá trình xử lý một danh sách các phần tử
để đặt chúng theo một thứ tự tăng hoặc giảm dựa trên
nội dung lưu trữ trên mỗi phần tử.
Có rất nhiều thuật toán sắp xếp song chúng ta chỉ
quan tâm đến 5 giải thuật sắp xếp thường sử dụng.
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
20
© Dương Thành Phết-www.thayphet.net
Khái niệm về nghịch thế:
a1 a2 a3 . . . . . . . . . . an-1 an
Giả sử mảng có thứ tự tăng dần, nếu i<j và ai>aj thì
gọi là nghịch thế
Mục tiêu của sắp xếp là khử các nghịch thế(bằng
cách hoán vị các phần tử)
Khoa CNTT Trường TC TÂY NAM Á
2.2.1. BÀI TOÁN SẮP XẾP
2.2.2. GIẢI THUẬT ĐỔI CHỔ TRỰC TIẾP-INTERCHANGE SORT
21
© Dương Thành Phết-www.thayphet.net
Ý tưởng:
Xuất phát từ đầu dãy, tìm tất cả nghịch thế chứa
phần tử này.
Triệt tiêu chúng bằng cách đổi chỗ phần tử này với
phần tử tương ứng trong cặp nghịch thế.
Lặp lại xử lý trên với các phần tử tiếp theo trong dãy.
Khoa CNTT Trường TC TÂY NAM Á
22
© Dương Thành Phết-www.thayphet.net
Minh Họa
2 12 8 5 1 6 4
2 12 8 5 1 6 4
i=1 j=2 j=5 i=2 j=3 j=4 i=3 j=7 i=4 j=6 i=5 i=6 i=7
Khoa CNTT Trường TC TÂY NAM Á
2.2.2. GIẢI THUẬT ĐỔI CHỔ TRỰC TIẾP-INTERCHANGE SORT
23
© Dương Thành Phết-www.thayphet.net
2 12 8 5 1 6 4
12 1 8 5 2 6 4
2 1 12 8 5 6 4
2 1 4 12 8 6 5
2 1 4 5 12 8 6
2 1 4 5 6 12 8
2 1 4 5 6 8 12
Ban đầu
Lần 1
Lần 2
Lần 3
Lần 4
Lần 5
Lần 6
Khoa CNTT Trường TC TÂY NAM Á
2.2.2. GIẢI THUẬT ĐỔI CHỔ TRỰC TIẾP-INTERCHANGE SORT
24
© Dương Thành Phết-www.thayphet.net
Giải thuật:
Bước 1 :
i = 1; // bắt đầu từ đầu dãy
Bước 2 :
j = i+1;//tìm các phần tử a[j] < a[i], j>i
Bước 3 :
Trong khi j < N thực hiện
Nếu a[j]<a[i]: Đổi chổ a[i] và a[j];
j = j+1;
Bước 4 :
i = i+1;
Nếu i < n: Lặp lại Bước 2.
Ngược lại: Dừng.
Khoa CNTT Trường TC TÂY NAM Á
2.2.2. GIẢI THUẬT ĐỔI CHỔ TRỰC TIẾP-INTERCHANGE SORT
25
© Dương Thành Phết-www.thayphet.net
Cài Đặt
void InterchangeSort(int a[], int N )
{ int i, j,tam;
for (i = 0 ; i<N-1 ; i++)
for (j =i+1; j < N ; j++)
if(a[j ]< a[i])
{
tam=a[i];
a[i]=a[j];
a[j]=tam;
}
}
Khoa CNTT Trường TC TÂY NAM Á
2.2.2. GIẢI THUẬT ĐỔI CHỔ TRỰC TIẾP-INTERCHANGE SORT
26
© Dương Thành Phết-www.thayphet.net
Đánh giá giải thuật:
Ðối với giải thuật đổi chỗ trực tiếp, số lượng các
phép so sánh xảy ra không phụ thuộc vào tình trạng
của dãy số ban đầu
Nhưng số lượng phép hoán vị thực hiện tùy thuộc
vào kết qủa so sánh
Khoa CNTT Trường TC TÂY NAM Á
2.2.2. GIẢI THUẬT ĐỔI CHỔ TRỰC TIẾP-INTERCHANGE SORT
2.2.3 GIẢI THUẬT CHỌN TRỰC TIẾP –SELECTION SORT
27
© Dương Thành Phết-www.thayphet.net
Ý Tưởng:
Đầu tiên dãy có N phần tử, ta chọn phần tử nhỏ nhất
trong dãy đổi chổ cho phần tử đầu tiên.
Tiếp theo, tìm phần tử nhỏ nhất của dãy n-1 phần tử
còn lại trong dãy đổi chổ cho phần tử thứ 2 của dãy.
Quá trình trên thực hiên đến khi nào trong mảng chỉ
còn 1 phần tử thi dừng lại.
Kết quả được mảng đã sắp xếp tăng.
Khoa CNTT Trường TC TÂY NAM Á
28
© Dương Thành Phết-www.thayphet.net
Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
I=1
Min
11 45 28 73 61 7 23 16
11 45 28 73 61 7 23 16
Khoa CNTT Trường TC TÂY NAM Á
2.2.3 GIẢI THUẬT CHỌN TRỰC TIẾP –SELECTION SORT
29
© Dương Thành Phết-www.thayphet.net
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
11 45 28 73 61 16 23 7
I=2
Min
11 45 28 73 61 7 23 16
Minh Họa
Khoa CNTT Trường TC TÂY NAM Á
2.2.3 GIẢI THUẬT CHỌN TRỰC TIẾP –SELECTION SORT
30
© Dương Thành Phết-www.thayphet.net
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
11 28 73 61 23 7
I=3
Min
45 16
11 45 28 73 61 7 23 16
Minh Họa
Khoa CNTT Trường TC TÂY NAM Á
2.2.3 GIẢI THUẬT CHỌN TRỰC TIẾP –SELECTION SORT
31
© Dương Thành Phết-www.thayphet.net
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
11 73 61 7 16 45
I=4
Min
28 23
11 45 28 73 61 7 23 16
Minh Họa
Khoa CNTT Trường TC TÂY NAM Á
2.2.3 GIẢI THUẬT CHỌN TRỰC TIẾP –SELECTION SORT
32
© Dương Thành Phết-www.thayphet.net
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
11 61 7 16 45 23
Min
I=5
73 28
11 45 28 73 61 7 23 16
Minh Họa
Khoa CNTT Trường TC TÂY NAM Á
2.2.3 GIẢI THUẬT CHỌN TRỰC TIẾP –SELECTION SORT
33
© Dương Thành Phết-www.thayphet.net
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
11 7 16 23 28 73
I=6
Min
45 61
11 45 28 73 61 7 23 16
Minh Họa
Khoa CNTT Trường TC TÂY NAM Á
2.2.3 GIẢI THUẬT CHỌN TRỰC TIẾP –SELECTION SORT
34
© Dương Thành Phết-www.thayphet.net
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
11 7 16 23 28 73 61 45
I=7
Min
11 45 28 73 61 7 23 16
Minh Họa
Khoa CNTT Trường TC TÂY NAM Á
2.2.3 GIẢI THUẬT CHỌN TRỰC TIẾP –SELECTION SORT
35
© Dương Thành Phết-www.thayphet.net
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
11 7 16 23 28 73 61 45
Kết thúc vì mảng
chỉ còn 1 phần tử
11 45 28 73 61 7 23 16
Minh Họa
Khoa CNTT Trường TC TÂY NAM Á
2.2.3 GIẢI THUẬT CHỌN TRỰC TIẾP –SELECTION SORT
36
© Dương Thành Phết-www.thayphet.net
Ban đầu
Lần 1
Lần 2
Lần 3
Lần 4
Lần 5
Lần 6
11 45 28 73 61 7 23 16
11 45 28 73 61 16 23 7
11 45 28 73 61 16 23 7
11 16 28 73 61 45 23 7
11 16 23 73 61 45 28 7
11 16 23 28 61 45 73 7
11 16 23 28 45 61 73 7
11 16 23 28 45 61 73 7 Lần 7
Khoa CNTT Trường TC TÂY NAM Á
2.2.3 GIẢI THUẬT CHỌN TRỰC TIẾP –SELECTION SORT
37
© Dương Thành Phết-www.thayphet.net
Giải thuật:
Bước 1:
I = 1
Bước 2:
Tìm phần tử nhỏ nhất a[min] trong dãy
hiện hành từ a[i] đến a[min]
Bước 3 :
Đổi chổ cho a[min] và a[i]
Bước 4 :
I = I + 1
Nếu I < N thì lập lại bước 2
Ngược lại thì dừng.
Khoa CNTT Trường TC TÂY NAM Á
2.2.3 GIẢI THUẬT CHỌN TRỰC TIẾP –SELECTION SORT
38
© Dương Thành Phết-www.thayphet.net
Cài Đặt void SelectionSort(int a[], int n)
{
int min, i, j, tam;
for (i = 0; i < n - 1; i++)
{
a[min] = a[i];
for (j = i + 1; j < n; j++)
if (a[j] < a[min])
a[min] =a[j];
tam=a[i];
a[i]=a[min];
a[min]=tam ;
}
} Khoa CNTT Trường TC TÂY NAM Á
2.2.3 GIẢI THUẬT CHỌN TRỰC TIẾP –SELECTION SORT
39
© Dương Thành Phết-www.thayphet.net
Đánh giá giải thuật:
Ðối với giải thuật chọn trực tiếp, có thể thấy rằng ở
lượt thứ i, bao giờ cũng cần (n-i) lần so sánh để xác
định phần tử nhỏ nhất hiện hành. Số lượng phép so
sánh này không phụ thuộc vào tình trạng của dãy
số ban đầu, do vây kết luận:
Khoa CNTT Trường TC TÂY NAM Á
2.2.3 GIẢI THUẬT CHỌN TRỰC TIẾP –SELECTION SORT
2.2.4. GIẢI THUẬT CHÈN TRỰC TIẾP –INSERT SORT
40
© Dương Thành Phết-www.thayphet.net
Ý Tưởng:
Cho dãy ban đầu a1, a2, …, an, ta có thể xem như đã
có đoạn gồm 1 phần tử a1 đã được sắp xếp,
Sau đó thêm a2 vào đoạn a1 sẽ có đoạn a1 a2 được
sắp xếp.
Tiếp tục thêm a3 vào đoạn a1 a2 để có đoạn a1 a2 a3
được sắp xếp.
Tiếp tục cho đến thêm khi xong an vào đoạn a1 a2
…an-1 sẽ có dãy a1 a2 ..an được sắp xếp
Khoa CNTT Trường TC TÂY NAM Á
41
© Dương Thành Phết-www.thayphet.net
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
13 7 9 4 11 3 17 15
1 2 3 4 5 6 7 8
i=2
13 7 9 4 11 3 17 15
Minh Họa
Khoa CNTT Trường TC TÂY NAM Á
2.2.4. GIẢI THUẬT CHÈN TRỰC TIẾP –INSERT SORT
42
© Dương Thành Phết-www.thayphet.net
Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
7 4 11 3 17 15
1 2 3 4 5 6 7 8
13 9
i=3
13 7 9 4 11 3 17 15
Khoa CNTT Trường TC TÂY NAM Á
2.2.4. GIẢI THUẬT CHÈN TRỰC TIẾP –INSERT SORT
43
© Dương Thành Phết-www.thayphet.net
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
11 17 15
1 2 3 4 5 6 7 8
3
i=4
7 9 13 4
13 7 9 4 11 3 17 15
Minh Họa
Khoa CNTT Trường TC TÂY NAM Á
2.2.4. GIẢI THUẬT CHÈN TRỰC TIẾP –INSERT SORT
44
© Dương Thành Phết-www.thayphet.net
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
17 15
1 2 3 4 5 6 7 8
3 4 7 9 13 11
i=5
13 7 9 4 11 3 17 15
Minh Họa
Khoa CNTT Trường TC TÂY NAM Á
2.2.4. GIẢI THUẬT CHÈN TRỰC TIẾP –INSERT SORT
45
© Dương Thành Phết-www.thayphet.net
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
17 15
1 2 3 4 5 6 7 8
4 7 9 11 13 3
i=6
13 7 9 4 11 3 17 15
Minh Họa
Khoa CNTT Trường TC TÂY NAM Á
2.2.4. GIẢI THUẬT CHÈN TRỰC TIẾP –INSERT SORT
46
© Dương Thành Phết-www.thayphet.net
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
15
1 2 3 4 5 6 7 8
3 4 7 9 11 13
i=7
17
13 7 9 4 11 3 17 15
Minh Họa
Khoa CNTT Trường TC TÂY NAM Á
2.2.4. GIẢI THUẬT CHÈN TRỰC TIẾP –INSERT SORT
47
© Dương Thành Phết-www.thayphet.net
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1 2 3 4 5 6 7 8
3 4 7 9 11 13
i=8
17 15
Kết thúc
13 7 9 4 11 3 17 15
Minh Họa
Khoa CNTT Trường TC TÂY NAM Á
2.2.4. GIẢI THUẬT CHÈN TRỰC TIẾP –INSERT SORT
48
© Dương Thành Phết-www.thayphet.net
13 7 9 4 11 3 17 15 Ban đầu
Lần 1
Lần 2
Lần 3
Lần 4
Lần 5
Lần 6
Lần 7
7 13 9 4 11 3 17 15
7 9 13 4 11 3 17 15
4 7 9 13 11 3 17 15
4 7 9 11 13 3 17 15
3 4 7 9 11 13 17 15
3 4 7 9 11 13 17 15
3 4 7 9 11 13 15 17
Khoa CNTT Trường TC TÂY NAM Á
2.2.4. GIẢI THUẬT CHÈN TRỰC TIẾP –INSERT SORT
49
© Dương Thành Phết-www.thayphet.net
Giải thuật:
Bước 1:
i=2; // a[1] đã được sắp xếp
Bước 2:
x=a[i];
Tìm vị trí pos thích hợp trong đoạn a[1] đến a[i-1]
để chèn a[i] vào
Bước 3:
Dời chỗ phần tử a[pos] đến a[i-1] sang phải một
vị trí để dành chỗ cho a[i]
Bước 4:
a[pos]=x //đoạn a[1] đến a[i] đã được sắp
Bước 5:
i=i+1;
Nếu i<n : lặp lại bước 2
Ngược lại: dừng
Khoa CNTT Trường TC TÂY NAM Á
2.2.4. GIẢI THUẬT CHÈN TRỰC TIẾP –INSERT SORT
50
© Dương Thành Phết-www.thayphet.net
Cài Đặt void InsertSort(int a[],int n) { int pos, x; for(int i=1 ; i<n ; i++) {
x=a[i]; pos=i-1; // tìm vị trí chèn x while((pos >=0 )&&(a[pos]>=x) { a[pos+1]=a[pos]; pos--; } a[pos+1]=x; //chèn x vào dãy
} }
Khoa CNTT Trường TC TÂY NAM Á
2.2.4. GIẢI THUẬT CHÈN TRỰC TIẾP –INSERT SORT
51
© Dương Thành Phết-www.thayphet.net
Đánh giá giải thuật:
Các phép so sánh xảy ra trong vòng lặp while tìm
vị trí thích hợp pos, và mỗi lần xác định vị trí đang
xét không thích hợp, sẽ dời chỗ phần tử a[pos]
tương ứng.
Giải thuật thực hiện tất cả n – 1 vòng lặp while, do
số lượng phép so sánh và dời chỗ này phụ thuộc
vào tình trạng của dãy số ban đầu, nên chỉ có ước
lượng trong từng trường hợp sau:
Khoa CNTT Trường TC TÂY NAM Á
2.2.4. GIẢI THUẬT CHÈN TRỰC TIẾP –INSERT SORT
2.2.5. GIẢI THUẬT NỔI BỌT –BUBBLE SORT
52
© Dương Thành Phết-www.thayphet.net
Ý Tưởng:
Xuất phát từ cuối dãy ,đổi chổ các cặp phần tử kế
cận để đưa phần tử đó về vị trí đứng đầu dãy hiện
hành
Sau đó sẽ không xét đến nó ở bước tiếp theo
Do vậy ở lần xử lý thứ i sẽ có vị trí dầu dãy là i phần
tử được sắp xếp.
Lặp lại xử lý trên cho đến khi không còn phần tử nào
để xét.
Khoa CNTT Trường TC TÂY NAM Á
1
53
© Dương Thành Phết-www.thayphet.net
Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
11
5
7
3
9
2
15
2
1
3
4
5
6
7
8
i
j 1
11
5
7
3
9
2
15
2
1
3
4
5
6
7
8
Ban đầu
Khoa CNTT Trường TC TÂY NAM Á
2.2.5. GIẢI THUẬT NỔI BỌT –BUBBLE SORT
15
54
© Dương Thành Phết-www.thayphet.net
Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1
11
5
7
3
9
2
2
1
3
4
5
6
7
8
i
j
Khoa CNTT Trường TC TÂY NAM Á
2.2.5. GIẢI THUẬT NỔI BỌT –BUBBLE SORT
15
55
© Dương Thành Phết-www.thayphet.net
Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1
2
11
5
7
3
9
2
1
3
4
5
6
7
8
i
j
Khoa CNTT Trường TC TÂY NAM Á
2.2.5. GIẢI THUẬT NỔI BỌT –BUBBLE SORT
15
56
© Dương Thành Phết-www.thayphet.net
Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1
2
3
11
5
7
9
2
1
3
4
5
6
7
8
i
j
Khoa CNTT Trường TC TÂY NAM Á
2.2.5. GIẢI THUẬT NỔI BỌT –BUBBLE SORT
15
57
© Dương Thành Phết-www.thayphet.net
Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1
2
3
5
11
7
9
2
1
3
4
5
6
7
8
i
j
Khoa CNTT Trường TC TÂY NAM Á
2.2.5. GIẢI THUẬT NỔI BỌT –BUBBLE SORT
15
58
© Dương Thành Phết-www.thayphet.net
Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1
2
3
5
7
11
9
2
1
3
4
5
6
7
8
i
j
Khoa CNTT Trường TC TÂY NAM Á
2.2.5. GIẢI THUẬT NỔI BỌT –BUBBLE SORT
15
59
© Dương Thành Phết-www.thayphet.net
Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1
2
3
5
7
9
11
2
1
3
4
5
6
7
8
i
j
Kết
thúc
Khoa CNTT Trường TC TÂY NAM Á
2.2.5. GIẢI THUẬT NỔI BỌT –BUBBLE SORT
60
© Dương Thành Phết-www.thayphet.net
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
Minh Họa
1
11
5
7
3
9
2
15
2
1
3
4
5
6
7
8 15
1
11
5
7
3
9
2
2
1
3
4
5
6
7
8 15
1
2
11
5
7
3
9
2
1
3
4
5
6
7
8 15
1
2
3
11
5
7
9
2
1
3
4
5
6
7
8 15
1
2
3
5
11
7
9
2
1
3
4
5
6
7
8 15
1
2
3
5
7
11
9
2
1
3
4
5
6
7
8 15
1
2
3
5
7
9
11
2
1
3
4
5
6
7
8 15
1
2
3
5
7
9
11
2
1
3
4
5
6
7
8
Ban đầu Bước 1 Bước 2 Bước 3 Bước 4 Bước 5 Bước 6 Bước 7
Khoa CNTT Trường TC TÂY NAM Á
2.2.5. GIẢI THUẬT NỔI BỌT –BUBBLE SORT
61
© Dương Thành Phết-www.thayphet.net
Giải thuật:
Bước 1:
i=1;
Bước 2:
j=N;
Trong khi (j>i) thực hiện:
Nếu a[j]<a[j-1]: Hoán vị a[j] và a[j-1]
j—;
Bước 3:
i=i+1;
Nếu i>N-1: Hết dãy, dừng
Ngược lại: Lặp lại Bước 2
Khoa CNTT Trường TC TÂY NAM Á
2.2.5. GIẢI THUẬT NỔI BỌT –BUBBLE SORT
62
© Dương Thành Phết-www.thayphet.net
Cài Đặt
void bubblesort(t M[],int N)
{
for ( int i=0 ; i<N-1 ; i++)
for(int j=N-1 ; j>i ; j--)
if(M[j]<M[j-1])
{
int tam=M[j];
M[j]=M[j-1];
M[j-1]=tam;
}
}
Khoa CNTT Trường TC TÂY NAM Á
2.2.5. GIẢI THUẬT NỔI BỌT –BUBBLE SORT
63
© Dương Thành Phết-www.thayphet.net
Đánh giá giải thuật:
Ðối với giải thuật nổi bọt, số lượng các phép so
sánh xảy ra không phụ thuộc vào tình trạng của dãy
số ban đầu
Nhưng số lượng phép hoán vị thực hiện tùy thuộc
vào kết qủa so sánh
Khoa CNTT Trường TC TÂY NAM Á
2.2.5. GIẢI THUẬT NỔI BỌT –BUBBLE SORT
64
© Dương Thành Phết-www.thayphet.net
Ý Tưởng:
Phân hoạch dãy M thành 2 dãy con thỏa mãn điều
kiện: “1/2 Dãy bên trái chứa các phần tử nhỏ hơn
các phần tử của 1/2 Dãy bên phải”
Nếu dãy con có nhiều hơn 1 phần tử thì thực hiện
sắp xếp dãy con (Đệ qui).
2.2.6.GIẢI THUẬT SẮP XẾP NHANH–QUICK SORT
Khoa CNTT Trường TC TÂY NAM Á
65
© Dương Thành Phết-www.thayphet.net
Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
10 5 7 3 9 2 15 1
Đoạn cần
sắp xếp
L=1
R=8
i=1; j=8
L R X=3
i j
Đoạn 1
L=1
R=3
Đoạn 2
L=4
R=8 Khoa CNTT Trường TC TÂY NAM Á
2.2.6.GIẢI THUẬT SẮP XẾP NHANH–QUICK SORT
66
© Dương Thành Phết-www.thayphet.net
Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1 2 3 7 9 5 15 10
Đoạn cần
sắp xếp
i=4; j=8
L R X=5
i j
L=1
R=3
L=4
R=8
Đoạn 1 Đoạn 2
L=4
R=5
L=5
R=8
Khoa CNTT Trường TC TÂY NAM Á
2.2.6.GIẢI THUẬT SẮP XẾP NHANH–QUICK SORT
67
© Dương Thành Phết-www.thayphet.net
Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1 2 3 5 9 7 15 10
Đoạn cần
sắp xếp
i=5; j=8
L R X=7
i j
L=1
R=3
L=4
R=5
L=6
R=8
L=5
R=8
Đoạn 2
Khoa CNTT Trường TC TÂY NAM Á
2.2.6.GIẢI THUẬT SẮP XẾP NHANH–QUICK SORT
68
© Dương Thành Phết-www.thayphet.net
Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1 2 3 5 7 9 15 10
Đoạn cần
sắp xếp
i=6; j=8
L R X=15
i j
L=1
R=3
L=4
R=5
L=6
R=8
L=6
R=7
Đoạn 1
Khoa CNTT Trường TC TÂY NAM Á
2.2.6.GIẢI THUẬT SẮP XẾP NHANH–QUICK SORT
69
© Dương Thành Phết-www.thayphet.net
Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1 2 3 5 7 9 10 15
Đoạn cần
sắp xếp
i=6; j=7
L R
X=15
i j
L=1
R=3
L=4
R=5
L=6
R=7
Khoa CNTT Trường TC TÂY NAM Á
2.2.6.GIẢI THUẬT SẮP XẾP NHANH–QUICK SORT
70
© Dương Thành Phết-www.thayphet.net
Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1 2 3 5 7 9 10 15
Đoạn cần
sắp xếp
i=4; j=5
L R
X=5
i j
L=1
R=3
L=4
R=5
Khoa CNTT Trường TC TÂY NAM Á
2.2.6.GIẢI THUẬT SẮP XẾP NHANH–QUICK SORT
71
© Dương Thành Phết-www.thayphet.net
Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1 2 3 5 7 9 10 15
Đoạn cần
sắp xếp
i=1; j=3
L R X=2
i j
L=1
R=3
Khoa CNTT Trường TC TÂY NAM Á
2.2.6.GIẢI THUẬT SẮP XẾP NHANH–QUICK SORT
72
© Dương Thành Phết-www.thayphet.net
Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1 2 3 5 7 9 10 15
Đoạn cần
sắp xếp
Không còn đoạn
nào cần sắp xếp
Khoa CNTT Trường TC TÂY NAM Á
2.2.6.GIẢI THUẬT SẮP XẾP NHANH–QUICK SORT
73
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
10 5 7 3 9 2 15 1
7 9 5 15 10
9 7 15 10
9 10 15
9 10
5 7
1 2 3
Đoạn [1- 8]
Đoạn [4- 8]
Đoạn [5- 8]
Đoạn [6- 8]
Đoạn [6- 7]
Đoạn [4- 5]
Đoạn [1- 3]
74
© Dương Thành Phết-www.thayphet.net
Giải thuật:
Bước 1:
i=1;
Bước 2:
j=N;
Trong khi (j>i) thực hiện:
Nếu a[j]<a[j-1]: Hoán vị a[j] và a[j-1]
j—;
Bước 3:
i=i+1;
Nếu i>N-1: Hết dãy, dừng
Ngược lại: Lặp lại Bước 2
Khoa CNTT Trường TC TÂY NAM Á
2.2.6.GIẢI THUẬT SẮP XẾP NHANH–QUICK SORT
75
© Dương Thành Phết-www.thayphet.net
Cài Đặt void QuickSort(int M[], int First, int Last)
{
int i, j, tam, x;
x = M[(First+Last)/2]; i = First; j = Last;
do {
while (M[i] <x) i++;
while (M[j] > X) j--;
if (i <= j)
{
tam=M[i];
M[i]=M[j];
M[j]=tam;
i++; j--;
}
}while (i<= i);
QuickSort(M, First, j);
QuickSort (M, i, Last);
} Khoa CNTT Trường TC TÂY NAM Á
2.2.6.GIẢI THUẬT SẮP XẾP NHANH–QUICK SORT
76
© Dương Thành Phết-www.thayphet.net
Đánh giá giải thuật:
+ Trường hợp tốt nhất, khi mảng M có thứ tự tăng:
Số phép gán: Gmin = N-1
Số phép so sánh: Smin = N×Log2(N)/2
Số phép hoán vị: Hmin = 0
+ Trường hợp xấu nhất, khi phần tử X được chọn
ở giữa dãy con là giá trị lớn nhất:
Số phép gán: Gmax = N×(N-1)/2
Số phép so sánh: Smax = (N-1)×(N-1)
Số phép hoán vị: Hmax = N×(N-1)/2
+ Trung bình:
Số phép gán: Gavg = (N-1)×(N+2)/4
Số phép so sánh: Savg = N×[Log2(N)+2N–2]/4
Số phép hoán vị: Havg = N×(N-1)/4
Khoa CNTT Trường TC TÂY NAM Á
2.2.6.GIẢI THUẬT SẮP XẾP NHANH–QUICK SORT
77
© Dương Thành Phết-www.thayphet.net
Chi phí trung bình O(n*log2n)
Chi phí cho trường hợp xấu nhất O(n2)
Chi phí này phụ thuộc vào cách chọn phần tử trục:
- Nếu chọn được phần tử có giá trị trung bình ta
sẽ chia thành 2 dãy bằng nhau
- Nếu chọn nhằm phần tử nhỏ nhất (hay lớn
nhất) O(n2)
Khoa CNTT Trường TC TÂY NAM Á
2.2.6.GIẢI THUẬT SẮP XẾP NHANH–QUICK SORT
78
1. Trình bày tư tưởng và minh họa giải thuật tìm kiếm
tuyến tính, tìm kiếm nhị phân
2. Cài đặt thuật toán tìm tuyến tính bằng cách:
- Sử dụng vòng lặp for
- Sử dụng vòng lặp while
3. Trong trường hợp các phần tử của dãy đã có thứ tự
tăng (hoặc giảm) hãy cài đặt lại thuật toán tìm nhị phân
2.3 Bài Tập
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á
79
1. Trình bày tư tưởng và minh họa 5 giải thuật sắp xếp
2. Cài đặt 5 giải thuật sắp xếp theo các trường hợp và
điền kết quả số lần thực hiện các phép toán vào bảng
sau:
© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường TC TÂY NAM Á