c. if(i!=vt)
vt=j;
swap(a[i],a[vt]);
08/02/2014
9
Sắp xếp chọn (t)
• Thực hiện từng bước
i vt 0 1 2 3 4 5 6
0 0 1 7 3 8 2 6 4
1 4 1 7 3 8 2 6 4
2 2 1 2 3 8 7 6 4
3 6 1 2 3 8 7 6 4
4 5 1 2 3 4 7 6 8
08/02/2014
10
5 5 1 2 3 4 6 7 8
Sắp xếp chọn (t)
• Độ phức tạp
(cid:1) Số phép toán so sánh: N(N-1)/2 + N
(cid:1) Số phép toán gán chỉ số: N(N-1)/2 +N
(cid:1) Số phép gán giá trị phần tử: 3*(N-1)
(cid:1) Độ phức tạp là O(n2)
(cid:1) Độ phức tạp là O(n2)
08/02/2014
11
Sắp xếp chèn - insertion sort
• Ý tưởng
(cid:1) Dựa trên ý tưởng việc sắp xếp quân bài
(cid:1) Chèn những quân bài đang cầm (xem xét) vào vị trí
thích hợp
(cid:1) Ban đầu chỉ có một quân bài
(cid:1) Ban đầu chỉ có một quân bài
(cid:1) Sau đó thêm các quân bài mới thì chèn quân bài đó
vào vị trí thích hợp
08/02/2014
12
Sắp xếp chèn (t)
• Ý tưởng
(cid:1) Xét mảng chỉ có phần tử - đã được sắp xếp
(cid:1) Mảng có k-1 phần tử đã được sắp xếp
(cid:1) Xét thêm phần tử thứ k (giá trị x) vào mảng trên
(cid:1) Xét từ vị trí k-1 đến đầu nếu các gặp phần tử lớn
(cid:1) Xét từ vị trí k-1 đến đầu nếu các gặp phần tử lớn
hơn x thì dịch phần tử đó về sau một ô
(cid:1) Gán giá trị x vào vị trí dịch chuyển tạo ra
08/02/2014
13
Sắp xếp chèn (t)
• Thuật toán
(cid:1) Input: A[0..N-1] phần từ
(cid:1) Ouput: A[0..N-1] đã được sắp xếp không giảm
1. for i=1->N-1
a. x=A[i];
a. x=A[i];
b. vt=i;
c. while (vt>0 && A[vt-1]>x)
A[vt]=A[vt-1];
vt--;
d. A[vt]=x;
08/02/2014
14
Sắp xếp chèn (t)
i vt 0 1 2 3 4 5 6
1 1 1 7 3 8 2 6 4
2
2 1
1 1
1 7
7 3
3 8
8 2
2 6
6 4
4
3 3 1 3 7 8 2 6 4
1 3 7 8 2 6 4 4 1
5 3 1 2 3 7 8 6 4
6 3 1 2 3 6 7 8 4
08/02/2014
15
1 2 3 4 6 7 8
Sắp xếp chèn (t)
• Độ phức tạp thuật toán
(cid:1) Số phép so sánh N(N-1)/2
(cid:1) Số phép gán giá trị phần tử: N(N-1)+2N
(cid:1) Số phép gán chỉ số: N(N-1)
(cid:1) Độ phức tạp thuật toán O(n2)
(cid:1) Độ phức tạp thuật toán O(n2)
08/02/2014
16
Sắp xếp nổi bọt - bubble sort
• Dựa trên ý tưởng về các bọt khí trong cốc bia
• Hai bọt khí cạnh nhau thì bọt lớn hơn sẽ nổi lên
trên
• Đến khi không còn bọt khí nào trái quy luật đó
thì các bọt khí đã được sắp xếp
thì các bọt khí đã được sắp xếp
08/02/2014
17
Sắp xếp nổi bọt (t)
• Ý tưởng
(cid:1) Xét hai phần tử ở đầu tiên của dãy, nếu không đúng
thứ tự đổi chỗ cho nhau
(cid:1) Tiếp tục xét các cặp đến cuối dãy
(cid:1) Lặp lại quá trình với cặp đầu dãy đến lúc không có
(cid:1) Lặp lại quá trình với cặp đầu dãy đến lúc không có
cặp nào bị thay đổi
08/02/2014
18
Sắp xếp nổi bọt (t)
• Thuật toán
• Input: A[0..N-1] phần tử
• Output: A[0..N-1] phần tử sắp xếp không giảm
1. for i=N-1 -> 1
a. for j=0->i-1
a. for j=0->i-1
if(a[j]>a[j+1])
swap(a[j],a[j+1]);
08/02/2014
19
Sắp xếp nổi bọt (t)
0 1 2 3 4 5 6
i
6
6
6
6
6
5
5
5
4
4 j
1
3
4
5
5
2
3
4
1
3
08/02/2014
20
1
1
1
1
1
1
1
1
1
1
1 7
3
3
3
3
3
3
3
3
2
2 3
7
7
7
7
7
2
2
2
3
3 8
8
2
2
2
2
7
6
6
6
4 2
2
8
6
6
6
6
7
4
4
6 6
6
6
8
8
4
4
4
7
7
7 4
4
4
4
4
8
8
8
8
8
8
Sắp xếp nổi bọt (t)
• Độ phức tạp thuật toán
(cid:1) Số phép toán so sánh N(N-1)/2
(cid:1) Số phép toán gán 3(N)(N-1)/2
(cid:1) Độ phức tạp thuật toán O(n2)
08/02/2014
21
Nhận xét
• So sánh độ phức tạp thuật toán của ba thuật
toán trên
(cid:1) Theo đánh giá chung
(cid:1) Đánh giá theo các tiêu chí
08/02/2014
22
• Số phép so sánh
• Số phép so sánh
• Số phép gán dữ liệu
• Số phép gán chỉ số
Nhận xét
• Nhìn chung ba thuật toán có độ phức tạp tương
đương vì thế thời gian thực hiện là tương
đương nhau
• Thực tế
(cid:1) Sự phức tạp của so sánh, phép gán, phép gán chỉ số
(cid:1) Sự phức tạp của so sánh, phép gán, phép gán chỉ số
là không giống nhau với các kiểu dữ liệu khác nhau
(Ví dụ)
08/02/2014
23
Nhận xét
• Thuật toán chọn, nổi bọt có thể chọn được k
phần tử đứng đầu, hoặc cuối trong N phần tử
mà không cần phải sắp xếp toàn bộ các phần tử
(Ví dụ)
• Thuật toán sắp xếp chèn, nổi bọt phù hợp với
• Thuật toán sắp xếp chèn, nổi bọt phù hợp với
hệ thống duy trì tính sắp xếp với dữ liệu thêm
và bớt thường xuyên mà không phải sắp xếp lại
toàn bộ (ví dụ)
08/02/2014
24
Thảo luận
• Đánh trường hợp xấu nhất, tốt nhất
(cid:1) Chọn
(cid:1) Chèn
(cid:1) Nổi bọt
08/02/2014
25
Thảo luận
• Trong trường hợp cho một dãy N phần tử đã
sắp xếp, cần thêm M phần tử vào dãy
08/02/2014
26
Thảo luận
• Thảo luận về tính ổn định thứ tự của các thuật
toán
(cid:1) Các phần tử có cùng giá trị so sánh giữ nguyên thứ
tự
08/02/2014
27
Nội dung trình bày
• Bài toán sắp xếp
• Tiếp cận sắp xếp đơn giản
(cid:1) Sắp xếp chọn
(cid:1) Sắp xếp chèn
(cid:1) Sắp xếp nổi bọt
(cid:1) Sắp xếp nổi bọt
08/02/2014
28
Bài tập trên lớp
• Sinh viên thực hiện các thuật toán với bộ dữ
liệu
• 1 6 4 7 3 9 3
08/02/2014
29
Bài tập
- Cài đặt thuật toán trên ngôn ngữ lập trình và chạy thử
-
Thử nghiệm các thuật toán sắp xếp để đạt được dãy không tăng với
các bộ dữ liệu sau
1 2 3 4 5 6
6 5 4 3 2 1
6 5 4 3 2 1
5 2 6 4 1 3
-
-
-
-
-
- Nhận xét trong trường hợp nào thuật toán nào thực hiện nhiều thao
tác nhất (đâu là trường hợp tốt nhất, xấu nhất) và số thao tác trong
trường hợp đó
Trong trường hợp độ phức tạp của phép chuyển chổ và so sánh là
khác nhau thì sắp xếp nào tốt hơn, ngược lại.
08/02/2014
30