Thuật toán với Swift Insertion Sort
Bài viết giải thích thuật toán sắp xếp Insertion Sort được triển khai bằng ngôn ngữ Swift theo cách dễ hiểu, dễ nhớ, không giống như trong sách giáo khoa.

Giới thiệu
Nói thiệt chứ không biết mấy bạn sao, chứ mấy cái thuật toán mà không xài là vài bữa mình quên hết. Dù đã học qua thuật toán này 3,4 lần cũng hem nhớ gì hết. Ahuhu, hay trí nhớ mình kém :'(
Giờ ghét quá, nên mình quyết định viết hết seri về thuật toán luôn cho nhớ. Mục tiêu là viết theo kiểu dễ nhớ, dễ hiểu không như trong sách giáo khoa. Cài đặt thì mình xài Swift luôn, chứ mấy ngôn ngữ khác có nhớ gì đâu.
Nguồn bài viết thì mình lấy ở swift-algorithm-club
Mấy bạn không biết Swift cũng đọc được vì Swift nó dễ nhìn lắm :))
Thôi hôm nay bắt đầu từ bài dễ nhất trước nhé đó là thuật toán sắp xếp Insertion Sort
Ý tưởng
Ví dụ đang sắp xếp mảng số nha. Ý tưởng của Insertion Sort như sau:
-
Cho một mảng số chưa sắp xếp
-
Chọn một số từ mảng đó, cho dễ thì chọn từ đầu mảng
-
Chèn số đó vào một mảng mới
-
Chọn tiếp một số từ mảng chưa sắp xếp vào mảng mới. So sánh với số ở mảng mới để sắp xếp vị trí cho chúng. Như vậy bạn được mảng mới với 2 phần tử đã sắp xếp
-
Tiếp tục lấy số từ mảng chưa sắp xếp -> so sánh với các số đã sắp xếp ở mảng mới -> đến khi mảng chưa sắp xếp rỗng -> nghỉ
Đó là lý do gọi thuật toán này là Insertion Sort
Ví dụ
Có mảng [ 7, 2, 0, 4 ] cần sắp xếp tăng dần, cứ bốc ra tửng phần tử rồi insert vào mảng mới
Lần 1: Bóc 7 được [7]
Lần 2: Bóc 2 được [2,7]
Lần 3: Bóc 0 được [0,2,7]
Lần 4: Bóc 4 được [0,2,4,7]
In-place sorting
Nếu xài 2 mảng thì nhìn gà lắm, nên người ta mới có thuật ngữ là In-place sort
an in-place algorithm is an algorithm which transforms input using a data structure with a small, constant amount of extra storage space.
Tức là không dung thêm tài nguyên nào cả. Lấy một mảng mần luôn.
Chúng ta sẽ dùng một thanh | để chặn 2 phần của một mảng là phần chưa và phần đã sắp xếp
[ | 7, 2, 0, 4 ]
[7 | , 2, 0, 4 ]
[2 , 7 | , 0, 4 ]
[0, 2 , 7 | , 4 ]
[0, 2 , 4 , 7 | ]
Chèn như thế nào?
Ví dụ đang ở bước này, cần đưa 0 về đầu mảng đã sắp xếp:
[2 , 7 , 0 | , 4 ] lưu 0
[2 , 7, 7 | , 4 ] đẩy 7 qua bên phải
[ 2 , 2 , 7 | , 4 ] đây 2 qua bên phải
[ 0 , 2 , 7 | , 4 ] giờ không có số nào bé hơn 0 nữa nên thay 2 bằng 0
Bạn nhớ là do từng bước thì phần mảng đầu luôn luôn là đã sắp xếp rồi. Tưởng tượng một thanh | trong mảng, đi tới đâu thì phần nó đi qua đã được sắp xếp.
Khi bóc một số từ phần mảng chưa sắp xếp ra, rồi chạy ngược lại để check với phần mảng đã sắp xếp đó.
Code
func insertionSort(_ array: [Int]) -> [Int] {
var a = array
for x in 1..<a.count {
var y = x
let temp = a[y]
while y > 0 && temp < a[y - 1] {
// -> đẩy cái bé về trước, lớn về sau -> sắp xếp tăng dần.
a[y] = a[y - 1] // Bước dịch sang phải nè
y -= 1
}
a[y] = temp // Không còn số nào bé hơn số đã lưu
}
return a
}
Độ phức tạp
Có 2 vòng lặp nên nếu khả năng xất nhất thì sẽ là O(n^2). Nghe giang hồ đồn Insertion Sort chỉ nhanh khi mảng có ít phần tử thôi.
Related Posts
Discover more content you might enjoy

English Course Challenge in 2 weeks - Day 12: Kinh nghiệm quay khoá học
Bài viết chia sẻ kinh nghiệm quay khóa học tiếng Anh về Bubble.io, bao gồm việc lựa chọn phần mềm Screen.Studio để quay màn hình và tự động tạo phụ đề, những bài học từ việc đặt mục tiêu và xác định đối tượng học viên trước khi chọn nội dung, cũng như lợi ích của việc thử thách bản thân để vượt qua nỗi sợ và hoàn thành dự định. Tác giả cũng giới thiệu khóa học 'Build your first web app in Bubble for beginners' dành cho người mới bắt đầu.

English Course Challenge in 2 weeks - Day 7: Fine-tuning ChatGPT là gì?
Bài viết chia sẻ tiến trình ngày thứ 7 trong thử thách tạo khóa học tiếng Anh trong 2 tuần. Tác giả giới thiệu về Fine-tuning ChatGPT, một tính năng cho phép tạo phiên bản ChatGPT tùy chỉnh dựa trên dữ liệu cung cấp, đặc biệt hữu ích cho chatbot hỗ trợ khách hàng. Bài viết cũng thảo luận về việc điều chỉnh hướng phát triển ứng dụng demo và khóa học, cùng với những khó khăn khi sử dụng API của OpenAI tại Việt Nam.

English Course Challenge in 2 weeks - Day 2: Tiềm năng của Prompt Engineering
Bài viết chia sẻ về việc phát triển ứng dụng SaaS AI demo cho khóa học Bubble, tập trung vào Prompt Engineering - kỹ thuật viết prompt hiệu quả cho AI. Tác giả giới thiệu cấu trúc prompt chuẩn gồm 6 phần: Persona, Context, Task, Format, Examplar và Tone, đồng thời trình bày ý tưởng và mockup cho ứng dụng hỗ trợ người dùng viết prompt tốt hơn, giải quyết vấn đề nhiều người gặp phải khi sử dụng AI.

Đối thoại với AI: Generative AI (AI tạo sinh) và những điều cần biết
Bài viết dạng hỏi đáp toàn diện về AI tạo sinh, bao gồm kỹ thuật viết prompt hiệu quả, cách kiếm tiền từ AI, các nền tảng thay thế Claude AI, chi phí huấn luyện mô hình lớn, và các khái niệm quan trọng như BERT, mô hình tiền huấn luyện cùng những vấn đề đạo đức liên quan.

Cách làm giàu bằng thực lực
Phân tích triết lý làm giàu của Naval Ravikant, người sáng lập Angel List, qua tweet storm nổi tiếng 'How to Get Rich'. Bài viết giải thích sự khác biệt giữa thịnh vượng và tiền bạc, tầm quan trọng của thu nhập thụ động, và cách xây dựng sự giàu có bền vững thông qua kiến thức chuyên biệt và đòn bẩy không cần xin phép.
