Professional Documents
Culture Documents
Chuong 6. Sắp xếp PDF
Chuong 6. Sắp xếp PDF
Sắp xếp
LOGO
Nội dung
Cho dãy số a:
12 2 8 5 1 6 4 15
Sắp xếp kiểu lựa chọn
(Selection sort)
i=0
i=1
Sắp xếp kiểu lựa chọn
(Selection sort)
i=2
i=3
i=4
Sắp xếp kiểu lựa chọn
(Selection sort)
i=5
i=6
Ví dụ
Dãy: 45 27 75 15 65 58 94 37 99 87
i 0 1 2 3 4 5 6 7 8 9
Ban 45 27 75 15 65 58 94 37 99 87
đầu
Lượt
1 15 27 75 45 65 58 94 37 99 87
2 15 27 75 45 65 58 94 37 99 87
3 15 27 37 45 65 58 94 75 99 87
4 15 27 37 45 65 58 94 75 99 87
5 15 27 37 45 58 65 94 75 99 87
6 15 27 37 45 58 65 94 75 99 87
7 15 27 37 45 58 65 75 94 99 87
8 15 27 37 45 58 65 75 87 99 94
9 15 27 37 45 58 65 75 87 94 99
Sắp xếp kiểu lựa chọn
(Selection sort)
Giải thuật:
SELECT_SORT(K, n) {
for (i = 0; i< n-1; i++) {
m = i;
for (j = i+1; j < n; j++)
if (K[j] < K[m]) m = j;
if (i < m) {
x = K[i];
K[i] = K[m];
K[m] = x;
}
}
}
Sắp xếp kiểu thêm dần
(Insertion sort)
Giả sử có một dãy a0 , a1 ,... ,an-1 trong
đó i phần tử đầu tiên a0 , a1 ,... ,ai-1 đã có
thứ tự.
Cho dãy số :
12 2 8 5 1 6 4 15
i=1
i=2
Sắp xếp kiểu thêm dần
(Insertion sort)
i=3
i=4
i=5
Sắp xếp kiểu thêm dần
(Insertion sort)
i=6
i=7
Ví dụ
Dãy: 45 27 75 15 65 58 94 37 99 87
i 0 1 2 3 4 5 6 7 8 9
Ban 45 27 75 15 65 58 94 37 99 87
đầu
Lượt
1 27 45 - - - - - - - -
2 27 45 75 - - - - - - -
3 15 27 45 75 - - - - - -
4 15 27 45 65 75 - - - - -
5 15 27 45 58 65 75 - - - -
6 15 27 45 58 65 75 94 - - -
7 15 27 37 45 58 65 75 94 - -
8 15 27 37 45 58 65 75 94 99 -
9 15 27 37 45 58 65 75 87 94 99
Sắp xếp kiểu thêm dần
(Insertion sort)
Giải thuật
INSERT_SORT (K, n) {/* x: biến phụ chứa khoá mới đang xét*/
for (i = 1; i< n; i++) {
x = K[i];
j = i-1;
while ((K[j] > x) && (j>=0)) {//Lùi K[j] một vị trí
K[j+1] = K[j];
j--;
}
K[j+1] = x;
}
}
Sắp xếp kiểu đổi chỗ
(Exchange sort)
Ý tưởng:
i=0 j=6
i=0 i=4
Sắp xếp kiểu đổ chỗ
(Exchange sort)
i=0 j=3
i=0 j=2
i=0 j=1
Sắp xếp kiểu đổi chỗ
(Exchange sort)
i=1 j=5
i=1 j=4
i=1 j=3
Sắp xếp kiểu đổi chỗ
(Exchange sort)
i=2 j=5
i=2 j=4
i=3 j=6
Sắp xếp kiểu đổi chỗ
(Exchange sort)
i=3 j=6
i=4 j=6
i=5
Ví dụ
Dãy: 45 27 75 15 65 58 94 37 99 87
i 0 1 2 3 4 5 6 7 8 9
Ban 45 27 75 15 65 58 94 37 99 87
đầu
Lượt
1 15 45 27 75 37 65 58 94 87 99
2 15 27 45 37 75 58 65 87 94 99
3 15 27 37 45 58 75 65 87 94 99
4 15 27 37 45 58 65 75 87 94 99
5 15 27 37 45 58 65 75 87 94 99
6 15 27 37 45 58 65 75 87 94 99
7 15 27 37 45 58 65 75 87 94 99
8 15 27 37 45 58 65 75 87 94 99
9 15 27 37 45 58 65 75 87 94 99
Sắp xếp kiểu đổi chỗ
(Exchange sort)
Giải thuật:
BUBLE_SORT (K, n) {
for (i = 0; i< n-1; i++)
for (j = n-1; j>i; j--)
if (K[j] < K[j-1])
{
x = K[j];
K[j] = K[j – 1] ;
K[j – 1] = x
}
}
Độ phức tạp của thuật toán
Sắp xếp kiểu lựa chọn
Độ phức tạp của thuật toán
Sắp xếp kiểu thêm dần
Độ phức tạp của thuật toán
Sắp xếp kiểu đổi chỗ
Săp xếp nhanh (Quick sort)
Ý tưởng:
sắp xếp dãy a1, a2 ..., an dựa trên việc phân hoạch
dãy ban đầu thành 3 phần :
Sau khi thực hiện phân hoạch, dãy ban đầu được
phân thành 3 đoạn:
• 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
Săp xếp nhanh (Ý tưởng)
Cho dãy số a:
12 2 8 5 1 6 4 15
0 1 2 3 4 5 6 7
1 2 4 5 6 8 12 15
Thuật toán sắp xếp kiểu hòa
nhập (Merge sort)
1 2 3 4 5 6 7 8
1 2 4 5 6 8 12 15
Ví dụ
Dãy: 45 27 75 15 65 58 94 37 99 87
i 0 1 2 3 4 5 6 7 8 9
Ban 45 27 75 15 65 58 94 37 99 87
đầu
Lượt
1 [45] [27] [75] [15] [65] [58] [94] [37] [99] [87]
2 [27 45] [15 75] [58 65] [37 94] [87 99]
3 [15 27 45 75] [37 58 65 94] [87 99]
4 [15 37 27 45 58 65 75 94] [87 99]
5 [15 37 27 45 58 65 75 87 94 99]
Thuật toán sắp xếp kiểu hòa
nhập (Merge sort)
Giải thuật:
MERGE (K, b, m, n, X){/*thực hiện hoà nhập hai mảng con đã
được sắp xếp thành một mảng mới X được sắp xếp*/
i = t = b; j = m + 1;
while (i <= m) and (j <= n) //hai mảng con vẫn còn khoá
if (K[i] < K[j]) // So sánh để chọn khoá nhỏ hơn
X[t++] = K[i++];
else
X[t++] = K[j++];
// Một trong hai mảng con đã hết khoá trước
if (i > m) // Mảng 1 hết khoá trước
for (; j<=n; )
X[t++] = K[j++];
else // Mảng 2 hết khoá trước
for (; i<=m; )
X[t++] = K[i++];}
Thuật toán sắp xếp kiểu hòa
nhập (Merge sort)
Giải thuật:
MPASS (K, X, n, h) {/*thực hiện một bước của sắp xếp kiểu hoà
nhập. Nó hoà nhập từng cặp mạch kế cận nhau, có độ dài h từ mảng K
sang mảng X, n là số lượng khoá trong K */
i = 0;
while (i<= n-2*h) //Hoà nhập cặp mạch có độ dài h
{
MERGE (K, i, i+h–1, i+2*h–1, X);
i = i+2*h;
}
if (i + h < n) //Hoà nhập cặp mạch còn lại với tổng độ dài < 2*h
MERGE (K, i, i+h–1, n-1, X);
else // Chỉ còn một mạch
for (; i<n; i++)
X[i] = K[i];
}
Thuật toán sắp xếp kiểu hòa
nhập (Merge sort)
Giải thuật:
STRAIGHT_MSORT (K, n) {/* Để thực hiện lưu trữ các mạch mới,
khi hoà nhập, ở đây phải dùng một mảng phụ X[n], K và X sẽ được dùng
luân phiên, h ghi nhận kích thước của các mạch, sau mỗi lượt h được
tăng gấp đôi */
h = 1;
while (h < n)
{
MPASS (K, X, n , h); // Hoà nhập và chuyển các khoá vào X
MPASS (X, K, n , 2*h); // Hoà nhập và chuyển các khoá vào K
h = 4+h;
}
}
Thuật toán sắp xếp kiểu hòa nhập