Chương 2 TÌM KiẾM & SẮP XẾP
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
1
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
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
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
2.1.1 Bài Toán Tìm Kiếm
(cid:1) 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. (cid:1) 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. (cid:1) 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? (cid:1) 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 ñó. (cid:1) Có 2 thuật toán chính: Tìm kiếm tuyến tính & Tìm kiếm nhị phân
3
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
(cid:1) Giả sử chúng ta có một mảng M gồm N phần tử. (cid:1) Vấn ñề ñặt ra là có hay không phần tử có giá trị bằng X trong mảng M? (cid:1) Nếu có thì phần tử có giá trị bằng X là phần tử thứ mấy trong mảng M?
4
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
2.1.2. Giải Thuật Tìm Kiếm Tuyến Tính
(cid:2) Ý 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.
5
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
(cid:2) Minh Họa
VD:Tìm x = 14
Tìm thấy tại Tìm thấy tại vị trí thứ 5 vị trí thứ 5
Chưa hết mảng
14
5
12 3
14 1 14 9
0 10 2
7
3
1
2
4
5
6
7
8
9
10
VD:Tìm x = 30
Hết mảng Chưa hết không tìm mảng thấy
30
5
12 3
7
1 14 9
0 10 2
3
1
2
10
4
5
6
7
8
9
6
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
(cid:2) 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.
7
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
(cid:2) 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.
}
(cid:2) ðánh giá giải thuật
ðộ phức tập tính toán cấp n: T(n)=O(n)
8
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
2.1.3 Giải Thuật Tìm Kiếm Nhị Phân
(cid:2) Ý 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).
9
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
Ư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ự.
10
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
(cid:2)Minh Họa
Tìm giá trị X = 85 (Tìm thấy)
Mid = 5 M[mid]= 46
M
F
L
85
90
1 7
12 12
23 23
34 34
46 46
59 59
69 69
77 77
X
X > M[mid]
11
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
(cid:2)Minh Họa
Tìm giá trị X = 85 (Tìm thấy)
Mid = 8 M[mid] = 77
F
L
M
7
12
23
34
46
85
90
59 59
69 69
77 77
X
X > M[mid]
12
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
(cid:2)Minh Họa
Tìm giá trị X = 85 (Tìm thấy)
Mid = 9 M[mid] = 85
M
L
F
7
12
23
34
46
59
69
77
85
90
X
ðã tìm thấy tại vị trí 9
X = M[mid]
13
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
(cid:2)Minh Họa 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
Tìm kiếm phần tử có giá trị X = 5 (tìm thấy):
First Last Mid M[Mid] Lần lặp First>L ast X= M[Mid] X< M[Mid] X> M[Mid]
B.ñầu False 5 1 10 True False False 8
1 False 2 1 4 False False True 3
2 False 3 3 4 False False True 4
14
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
3 False 4 4 4 True 5
(cid:2) Minh Họa
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
Tìm kiếm phần tử có giá trị X = 7 (không tìm thấy)
First Last Mid M[Mid] Lần lặp First> Last X= M[Mid] X< M[Mid] X> M[Mid]
B.ñầu False 1 10 False True False 5 8
1 False 1 4 False False True 2 3
2 False 3 4 False False True 3 4
3 False 4 4 False False True 4 5
15
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
4 True 5 4
(cid:2) 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
16
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
Bkt: Kết thúc
(cid:2) 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;
(cid:2) ðánh giá giải thuật
ðộ phức tập tính toán cấp n: T(n)=O(Log2n)
17
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
}
2.2 Các giải thuật sắp xếp
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
18
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
2.2.1. Bài Toán Sắp Xếp
(cid:1) ðể thuận tiện và giảm thiểu thời gian thao tác mà ñặc biệt là ñể tìm kiếm. Do vậy 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. (cid:1) 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ử. (cid:1) 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.
19
Khoa CNTT Trường Cð CNTT TP.HCM
© 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
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ử)
20
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
2.2.2. Giải Thuật ðổi Chổ Trực Tiếp-Interchange Sort
(cid:2) Ý tưởng:
(cid:3) Xuất phát từ ñầu dãy, tìm tất cả nghịch thế chứa
phần tử này.
(cid:3) 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ế.
(cid:3) Lặp lại xử lý trên với các phần tử tiếp theo trong dãy.
21
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
(cid:2) Minh Họa
2 8 5 1 6 4 12
2 8 5 1 6 4 12
22
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
i=1 i=2 j=2 i=3 j=3 i=4 j=4 i=5 j=5 i=6 j=6 i=7 j=7
12 2 8 5 1 6 4 Ban ñầu
1 12 8 5 2 6 4 Lần 1
1 2 12 8 5 6 4 Lần 2
2 4 12 8 6 5 1 Lần 3
2 4 5 12 8 6 1 Lần 4
2 4 5 6 8 12 1 Lần 5
23
Khoa CNTT Trường Cð CNTT TP.HCM
© Dương Thành Phết-www.thayphet.net
2 4 5 6 8 12 1 Lần 6
(cid:2) 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]
Bước 4 : i = i+1;
Nếu i < n: Lặp lại Bước 2.
Ngược lại: Dừng. 24 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2) Cài ðặt void InterchangeSort(int a[], int N )
i, j,tam;
{
int
for (i = 0 ; i for (j =i+1; j < N ; j++) if(a[j ]< a[i]) {
tam=a[i];
a[i]=a[j];
a[j]=tam;
} } 25 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2) ðánh giá giải thuật: (cid:3) Ðố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
(cid:3) 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 26 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2) Ý Tưởng: (cid:3) ðầ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. (cid:3) 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.
(cid:3) 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. (cid:3) Kết quả ñược mảng ñã sắp xếp tăng. 27 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2) Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần Min 28 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net I=1 (cid:2) Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần Min 29 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net I=2 (cid:2) Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần Min 30 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net I=3 (cid:2) Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần Min 31 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net I=4 (cid:2) Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần Min 32 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net I=5 (cid:2) Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần Min 33 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net I=6 (cid:2) Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần Min 34 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net I=7 (cid:2) Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần Kết thúc vì mảng
chỉ còn 1 phần tử 35 Khoa CNTT Trường Cð CNTT TP.HCM © 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 36 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net Lần 7 (cid:2) 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. 37 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2)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 ;
} } 38 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2) ðánh giá giải thuật: (cid:3)Ðố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: 39 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2) Ý Tưởng: (cid:3) 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, (cid:3) Sau ñó thêm a2 vào ñoạn a1 sẽ có ñoạn a1 a2 ñược sắp xếp. (cid:3) Tiếp tục thêm a3 vào ñoạn a1 a2 ñể có ñoạn a1 a2 a3 ñược sắp xếp. (cid:3) Tiếp tục cho ñến thêm khi xong an vào ñoạn a1 a2 40 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2) Minh Họa 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 13 7 9 4 11 3 17 15 41 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2) Minh Họa 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 7 13 9 4 11 3 17 15 42 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2) Minh Họa 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 7 9 13 4 11 3 17 15 43 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2) Minh Họa 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 4 7 9 13 11 3 17 15 44 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2) Minh Họa 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 4 7 9 11 13 3 17 15 45 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2) Minh Họa 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 3 4 7 9 11 13 17 15 46 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2) Minh Họa 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 Kết thúc 3 4 7 9 11 13 17 15 47 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net 13 7 9 3 11 17 15 4 Ban ñầu 7 13 9 3 11 17 15 4 Lần 1 7 9 13 3 11 17 15 4 Lần 2 4 7 9 3 13 11 17 15 Lần 3 4 7 9 3 11 13 17 15 Lần 4 3 4 7 11 13 17 15 9 Lần 5 3 4 7 11 13 17 15 9 Lần 6 48 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net 3 4 7 11 13 15 17 9 Lần 7 (cid:2) Giải thuật: i=2; // a[1] ñã ñược sắp xếp 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 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] a[pos]=x //ñoạn a[1] ñến a[i] ñã ñược sắp i=i+1;
Nếu i 49 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2)Cài ðặt int pos, x;
for(int i=1 ; 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 } } 50 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2) ðánh giá giải thuật: (cid:3) 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.
(cid:3) 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: 51 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2) Ý Tưởng: (cid:3) 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 (cid:3) Sau ñó sẽ không xét ñến nó ở bước tiếp theo
(cid:3) 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. (cid:3) Lặp lại xử lý trên cho ñến khi không còn phần tử nào ñể xét. 52 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net (cid:2) Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần Ban ñầu 1 1 2 2 11 11 i 3 3 5 5 4 4 7 7 5 5 3 3 6 6 9 9 7 7 2 2 8 8 15 15 53 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net 1 1 j (cid:2) Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần 1 2 1 i 3 11 4 5 5 7 6 3 7 9 8 2 54 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net 15 j (cid:2) Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần 1 2 1 3 2 i 4 11 5 5 6 7 7 3 8 9 55 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net 15 j (cid:2) Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần 1 2 1 3 2 4 3 i 5 11 6 5 7 7 8 9 56 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net 15 j (cid:2) Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần 1 2 1 3 2 4 3 5 5 i 6 11 7 7 8 9 57 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net 15 j (cid:2) Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần 1 2 1 3 2 4 3 5 5 6 7 i 7 11 8 9 58 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net 15 j (cid:2) Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần 1 2 1 3 2 4 3 5 5 6 7 7 9 i 8 11 Kết
thúc 59 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net 15 j (cid:2) Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 11 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 5 11 2 2 2 2 2 2 4 4 4 4 4 4 4 4 7 5 11 3 3 3 3 3 5 5 5 5 5 5 5 5 3 7 5 11 5 5 5 5 6 6 6 6 6 6 6 6 9 3 7 5 11 7 7 7 7 7 7 7 7 7 7 7 2 9 3 7 7 11 9 9 8 8 8 8 8 8 8 8 15 2 9 9 9 9 11 11 Ban ñầu Bước 1 Bước 2 Bước 3 Bước 4 Bước 5 Bước 6 Bước 7 60 Khoa CNTT Trường Cð CNTT TP.HCM © Dương Thành Phết-www.thayphet.net 1 15 15 15 15 15 15 15 (cid:2) Giải thuật: j=N;
Trong khi (j>i) thực hiện:2.2.3 Giải Thuật Chọn Trực Tiếp –Selection Sort
16
11
45
28
73
61
7
23
16
11
45
28
73
61
7
23
16
11
45
28
73
61
7
23
7
11
45
28
73
61
16
23
16
11
45
28
73
61
7
23
7
11
45
28
73
61
16
23
16
11
45
28
73
61
7
23
7
11
16
28
73
61
45
23
16
11
45
28
73
61
7
23
7
11
16
23
73
61
45
28
16
11
45
28
73
61
7
23
73
7
11
16 23
28
61
45
16
11
45
28
73
61
7
23
73
7
11
16 23
28
45
61
16
11
45
28
73
61
7
23
73
7
11
16 23
28
45
61
16
11 45 28 73 61
7 23
7
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
2.2.4. Giải Thuật Chèn Trực Tiếp –Insert Sort
…an-1 sẽ có dãy a1 a2 ..an ñược sắp xếp
1 2 3 4 5 6 7 8
i=2
1 2 3 4 5 6 7 8
i=3
1 2 3 4 5 6 7 8
i=4
1 2 3 4 5 6 7 8
i=5
1 2 3 4 5 6 7 8
i=6
1 2 3 4 5 6 7 8
i=7
1 2 3 4 5 6 7 8
i=8
Bước 1:
Bước 2:
Bước 3:
Bước 4:
Bước 5:
void InsertSort(int a[],int n)
{
2.2.5. Giải Thuật Nổi Bọt –Bubble Sort
Bước 1:
i=1;
Bước 2: