Sắp xếp nổi bọt (bubble sort).[r]
(1)Sắp xếp (Sorting)
Nguyễn Mạnh Hiển
(2)Nội dung
1 Sắp xếp chọn Sắp xếp bọt Sắp xếp chèn
4 Sắp xếp vun đống Sắp xếp trộn
(3)(4)Sắp xếp chọn
• Dãy A gồm n phần tử a0, a1, …, an-1
• Mỗi bước xét danh sách chưa xếp (unsorted sublist - USL)
• Có n-1 bước:
− Bước 0: USL0 = {a0, a1, …, an-1} − Bước 1: USL1 = {a1, …, an-1}
…
(5)Sắp xếp chọn (tiếp) • Mỗi bước:
− Tìm phần tử nhỏ amin USL
− Đổi chỗ amin phần tử USL
(6)Ví dụ xếp chọn
• Ban đầu: 64, 25, 12, 22, 11 (11 64) • Sau bước 0: 11, 25, 12, 22, 64 (12 25) • Sau bước 1: 11, 12, 25, 22, 64 (22 25) • Sau bước 2: 11, 12, 22, 25, 64 (25 25) • Sau bước 3: 11, 12, 22, 25, 64
(7)Cài đặt xếp chọn
template <typename T>
void selectionSort(vector<T> & a) {
for (int i = 0; i < a.size() - 1; i++) { int vt = i; // vị trí
for (int j = i + 1; j < a.size(); j++) if (a[vt] > a[j])
vt = j; // cập nhật vị trí
if (vt != i) { // đổi chỗ phần tử đầu USL T tg = a[vt];
a[vt] = a[i]; a[i] = tg; }
(8)Phân tích xếp chọn
• Đếm số phép so sánh a[vt] > a[j]
• Vịng for bên lặp với j từ i+1 đến n-1, tức có n-1-i phép so sánh
• Vịng for bên ngồi lặp với i từ đến n-2 𝑡 𝑛 = 𝑛 − − 𝑖
𝑛−2
𝑖=0
= 𝑛 − + 𝑛 − + ⋯ + = 𝑛 𝑛 −
2 = 𝑂(𝑛
(9)(10)Sắp xếp bọt
• Mỗi bước duyệt qua phần tử a0, a1, …, ak • Tại phần tử ai (i < k):
− So sánh ai với ai+1
− Đổi chỗ chúng chưa thứ tự