Duyệt qua dãy, nếu 2 phần tử kề nhau không thứ tự thì hoán đổi. Thực hiện cho đến khi dãy có thứ tự Thuật giải nổi bọt (Bubble sort)[r]
Trang 1Sắp thứ tự
Trang 21 Phương pháp chèn (Insertion sort)
Nội dung phương pháp:
• Xét dãy a1, …., ai-1 có thứ tự, tìm vị trí thích hợp của ai trong dãy trên để chèn vào sao cho ta
được dãy a1, …., ai có thứ tự
• Thực hiện với i = 2, … , n ta được dãy a1, ….,
an có thứ tự
Trang 51 (
) 1 ( )
1 (
2
) 1 (
2
2 max
i n
M
n M
n i
2
) 1
n C
Trang 72 Phương pháp chọn (Selection sort)
Nội dung phương pháp:
• Chọn phần tử nhỏ nhất trong dãy ai, …., an là ak
• Hoán đổi phần tử ai với ak
Thực hiện với i = 1, … , n-1 ta được dãy a1, ….,
an có thứ tự
Trang 10( )
1 (
) 1 (
3
) 1 (
3
2 max
n M
n
M
n i
2
) 1
n C
Trang 133 Phương pháp đổi chổ
Nội dung phương pháp:
Duyệt qua dãy, nếu 2 phần tử kề nhau không thứ tự thì hoán đổi
Thực hiện cho đến khi dãy có thứ tự
Thuật giải nổi bọt (Bubble sort)
Phép duyệt: duyệt từ cuối về đầu dãy -> phần
tử nhỏ nhất về đầu dãy: nổi bọt
Trang 15Sap thu tu - phuong phap noi bot
void bubblesort(elem a[], int n, int (*comp)(elem, elem)) {
Trang 16swap(a[j], a[j-1]);
OK = 0;
} i++;
Trang 17Thuật giải Sàng (Shaker sort)
Nội dung phương pháp:
Thực hiện lặp 2 quá trình liên tiếp:
Duyệt từ phải qua trái: Nổi bọtDuyệt từ trái qua phải: Lắng đọngMỗi quá trình ghi nhận vị trí hóa đổi sau cùng làm điểm xuất phát cho quá trình tiếp theo
Thực hiện cho đến khi phải vượt trái
Trang 18Thuật giải Shaker sort(C)
Trang 19II Các thuật giải kải tiến
Trang 201 Giải thuật “vun đống” (Heap sort)
Cải tiến từ phương pháp chọn
Định nghĩa:
• Heap: Là cấu trúc cây nhị phân đầy đủ theo nghĩa: các nút được bố trí tuần tự từ mức thấp đến mức cao, từ trái qua phải
Ví dụ:
Trang 21Giải thuật “vun đống” (Heap sort)
• Heap max (min): Là cấu trúc heap thỏa điều kiện : mọi nút đều có khóa lớn (nhỏ) hơn 2 con
Ví dụ:
9
6 8
5
2 1
4
Trang 23Khởi tạo heap max ban đầu
• Ta có ai với i=n/2+1, … n là các nút lá trên cây nên hiển nhiên thỏa mãn tính chất heap max
• Để khởi tạo heap max ban đầu ta tìm cách biến đổi a i (với i=n/2, …, 1) thành heap max khi ai+1,
…, a n thỏa heap max
Trang 24Sắp thứ tự
• Khi i=1 ta có dãy thỏa mãn tính chất heap max, nghĩa là a1 là phần tử lớn nhất
• Để sắp thứ tự, phần tử lớn nhất phải nằm cuối nên ta hoán đổi phần tử a1 với an
• Biến đổi a1 thành heap max khi a2, …, a n-1 thỏa heap max
• Tiếp tục hoán đổi và biến đổi cho đến khi dãy
có thứ tự
Trang 253 2
5
9
1 4
3 2
5
4
Trang 261 4
3 2
5
3
1 4
9 2
5
3
Trang 278
1 4
9 2
3
2
1 4
9 8
3
Trang 281 4
9 8
9 8
3
Trang 299 8
7
Trang 30Giải thuật biến đổi heap max (q, r)
– j=2i 2.3 Ngược lại
Trang 31Sắp thứ tự
1 Khởi tạo heap max ban đầu
Với i=n/2, …, 1 Thực hiện:
Biến đổi heap max(i, n)
Trang 32void sift(elem a[ ], int q, int r, int (*comp)(elem, elem))
memcpy(&a[i], &a[j], sz);
i = j;
j = 2*i+1; //lưu ý }
else
cont = 0;
}
Trang 342 Giải thuật Quick sort
• Cải tiến từ phương pháp đổi chổ
• Dựa trên phép phân hoạch:
• Chọn giá trị phân hoạch x thỏa:
• Tiếp tục thực hiện cho đến khi i>j
Kết quả dãy sẽ bị phân hoạch thành 2 dãy:
Dãy từ l đến j mang giá trị ≤ x
Dãy từ i đến r mang giá trị ≥ x
Trang 35if (l<j) sort(a, l, j, comp);
if (i<r) sort(a, i, r, comp);
}
Trang 36void qsort(elem a[ ], int n, int (*comp)(elem, elem)) {
sort(a, 0, n-1, comp);
}
Trang 37Bài tập
• Viết
– Quick sort 1 lời gọi đệ quy
– Quick sort không đệ quy
– Chương trình nhập 1 dãy số nguyên, đưa:
• Lẻ về đầu dãy và sắp thứ tự tăng
• Chẵn về cuối dãy và sắp thứ tự giảm