Nâng cao · Mức D · Bài 4

Sắp xếp mảng danh sách, thuật toán Nổi bọt

Mục tiêu: Máy tạo 6 số ngẫu nhiên trong một danh sách rồi sắp xếp từ nhỏ đến lớn bằng thuật toán nổi bọt.

Em sẽ học gì

  • Nội dung trong bài: thuật toán sắp xếp nổi bọt.
  • Hoán đổi hai phần tử của danh sách qua một biến tạm.
  • Và hai vòng lặp lồng nhau.
Kết quả cần đạt
Kết quả cần đạt: bấm cờ xanh để chạy thử.
141

Bài làm như sau. Đặt mèo sang bên phải để chừa chỗ cho danh sách: x bằng 120, y bằng âm 40. Chọn nhóm Biến số, bấm Tạo một Danh sách, đặt tên là ds. Bấm Tạo một biến, đặt tên là j: vị trí của cặp đang so sánh. Tạo biến tam: chỗ để tạm một số khi đổi chỗ.

Bước 1

Thuật toán. 1. Tạo 6 số ngẫu nhiên trong danh sách. 2. Nổi bọt: lặp (n − 1) lượt; mỗi lượt: j = 1, lặp (n − 1) lần: nếu phần tử thứ j lớn hơn phần tử thứ j + 1 thì đổi chỗ hai phần tử; j tăng 1.

241

Sơ đồ khối ở khung bên phải. Đầu tiên, tạo 6 số ngẫu nhiên trong danh sách ds. Vòng lặp ngoài chạy n trừ 1 lượt. Mỗi lượt, j bắt đầu từ 1. Vòng lặp trong: phần tử thứ j lớn hơn phần tử thứ j cộng 1 thì đổi chỗ qua biến tam, rồi j tăng 1. Hết các lượt thì nói: Đã sắp xếp xong!

Bước 2
341

Chọn nhóm Sự kiện, kéo khối: Khi bấm vào cờ xanh,

Bước 3
441

Chọn nhóm Biến số, gắn khối xoá hết tất cả trong ds,

Bước 4
541

khối lặp lại, trong nhóm Điều khiển, đổi thành 6 lần,

Bước 5
641

bên trong, khối thêm phần tử vào trong ds, trong nhóm Biến số,

Bước 6
741

thả khối lấy ngẫu nhiên, trong nhóm Các phép toán, vào ô phần tử, đổi số thứ hai thành 99.

Bước 7
841
Chạy thử

Chạy thử: bấm cờ xanh, danh sách có 6 số ngẫu nhiên, chưa theo thứ tự nào. Bấm lần nữa sẽ ra 6 số khác.

Bước 8
941

Phần hai, sắp xếp nổi bọt. Mỗi lượt, ta đi từ đầu danh sách, so sánh từng cặp đứng cạnh nhau: nếu số trước lớn hơn số sau thì đổi chỗ. Hết một lượt, số lớn nhất nổi về cuối. Lặp lại n trừ 1 lượt thì cả danh sách được sắp xếp.

Bước 9
1041

Vòng lặp ngoài, đếm số lượt: chọn nhóm Điều khiển, gắn khối lặp lại xuống dưới cùng.

Bước 10
1141

Số lượt là số phần tử trừ 1. Lấy khối phép trừ, trong nhóm Các phép toán, đặt ra chỗ trống, ô bên phải gõ 1,

Bước 11
1241

ô bên trái thả khối kích thước của ds, trong nhóm Biến số, rồi kéo vào ô số lần lặp.

Bước 12
1341

Bên trong: mỗi lượt bắt đầu lại từ đầu danh sách. Khối đặt biến thành, chọn j, gõ 1.

Bước 13
1441

Vòng lặp trong, đi qua từng cặp: thêm một khối lặp lại, gắn dưới khối đặt j.

Bước 14
1541

6 phần tử thì có 5 cặp liền kề, nên số lần lặp cũng là kích thước trừ 1: khối phép trừ, gõ 1,

Bước 15
1641

thả khối kích thước của ds, kéo vào ô số lần lặp của vòng lặp trong.

Bước 16
1741

Trong vòng lặp trong, khối điều kiện nếu,

Bước 17
1841

Điều kiện là: phần tử thứ j lớn hơn phần tử thứ j cộng 1, tức là cặp này đang đứng sai thứ tự.

Bước 18
1941

Dựng phần tử đứng sau trước. Lấy khối phép cộng, trong nhóm Các phép toán, đặt ra chỗ trống, ô bên phải gõ 1,

Bước 19
2041

ô bên trái thả biến j, trong nhóm Biến số,

Bước 20
2141

lấy khối phần tử thứ của ds, trong nhóm Biến số, đặt bên dưới, kéo khối j cộng 1 vào ô số thứ tự: phần tử thứ j cộng 1.

Bước 21
2241

Lấy khối so sánh lớn hơn, trong nhóm Các phép toán, kéo phần tử thứ j cộng 1 vào bên phải.

Bước 22
2341

Lấy thêm một khối phần tử thứ của ds,

Bước 23
2441

thả biến j vào ô số thứ tự, kéo vào bên trái của phép so sánh, rồi kéo cả điều kiện vào khối nếu.

Bước 24
2541

Giờ là phần đổi chỗ, gồm ba bước. Bước một: cất phần tử thứ j vào biến tam.

Bước 25
2641

Trong khối nếu, khối đặt biến thành, chọn tam,

Bước 26
2741

lấy khối phần tử thứ của ds,

Bước 27
2841

thả biến j, kéo vào ô giá trị.

Bước 28
2941

Bước hai: ghi phần tử đứng sau vào vị trí j. Lấy khối thay thế phần tử thứ của danh sách ds, trong nhóm Biến số,

Bước 29
3041

khối phép cộng, gõ 1,

Bước 30
3141

thả biến j,

Bước 31
3241

khối phần tử thứ của ds, kéo j cộng 1 vào, kéo phần tử thứ j cộng 1 vào ô cuối cùng, sau chữ bằng,

Bước 32
3341

ô số thứ tự thả biến j.

Bước 33
3441

Bước ba: ghi số đang cất trong tam vào vị trí j cộng 1. Thêm một khối thay thế phần tử nữa,

Bước 34
3541

ô cuối cùng thả biến tam,

Bước 35
3641

khối phép cộng, gõ 1,

Bước 36
3741

thả biến j, kéo j cộng 1 vào ô số thứ tự.

Giải thích: Vì sao cần biến tạm? Khi ghi phần tử sau đè lên vị trí j, giá trị cũ ở vị trí j sẽ mất. Nên phải cất nó vào tam trước, giống như đổi chỗ hai cốc nước thì cần một cốc thứ ba.

Bước 37
3841

Sau khối nếu, vẫn trong vòng lặp trong: khối thay đổi biến một lượng, chọn j, giữ số 1: sang cặp kế tiếp.

Bước 38
3941

Thêm khối đợi, trong nhóm Điều khiển, để kịp nhìn từng bước, gõ 0 chấm 3 giây.

Bước 39
4041

Cuối cùng, dưới vòng lặp ngoài: khối nói, trong nhóm Hiển thị, gõ: Đã sắp xếp xong! Chương trình sắp xếp hoàn chỉnh: n trừ 1 lượt, mỗi lượt so sánh từng cặp liền kề và đổi chỗ nếu đứng sai thứ tự.

Bước 40
4141
Chạy thử

Chạy thử: bấm cờ xanh. Nhìn danh sách trên sân khấu: các số lớn lần lượt nổi dần xuống cuối, giống bọt khí nổi lên. Kết quả: danh sách đã được xếp từ nhỏ đến lớn. Chạy lần nữa với 6 số khác. Sau lượt thứ nhất, số lớn nhất đã về đúng vị trí cuối cùng. Sau lượt thứ hai, đến số lớn thứ nhì. Lần thứ ba: dù các số ban đầu thế nào, sau 5 lượt danh sách luôn được sắp xếp.

Bước 41

Các khối mới trong bài

  • Khối thay thế phần tử thứ … của danh sách: ghi một giá trị mới đè lên phần tử ở số thứ tự đã cho.

Kỹ thuật lập trình đã học

  • Về kỹ thuật lập trình, bài này ta học: sắp xếp nổi bọt: so sánh từng cặp liền kề, đứng sai thứ tự thì đổi chỗ.
  • Hoán đổi cần biến tạm: cất một giá trị vào tam, ghi đè, rồi ghi tam vào chỗ kia.
  • Vòng lặp lồng nhau: vòng ngoài đếm lượt, vòng trong đi qua từng cặp.
  • Và cách quan sát thuật toán: hiện danh sách trên sân khấu, thêm khối đợi để nhìn từng bước.

Bài tập

Bài tập: tạo thêm một biến đếm số lần đổi chỗ. Rồi sửa điều kiện để danh sách được xếp từ lớn đến nhỏ.

Tìm số lớn nhất trong danh sách Máy đoán số bằng cách chia đôi
ZaloCộng đồng hỗ trợ lập trình ScratchCộng đồng hỗ trợ