Menu
×

Được chứng nhận

Ghi lại kiến ​​thức của bạn

Đăng nhập Đăng ký

Tạo Tài khoản Example.com.vn miễn phí để cải thiện trải nghiệm học tập của bạn

Người tìm đường và việc học của tôi

Theo dõi tiến độ học tập của bạn tại Example.com.vn và thu thập phần thưởng

Nâng cấp

Trở thành người dùng PLUS và mở khóa các tính năng mạnh mẽ (không có quảng cáo, lưu trữ, hỗ trợ, ..)

Bắt đầu từ đâu

Bạn không chắc chắn muốn bắt đầu từ đâu? Đi theo con đường được hướng dẫn của chúng tôi

Trình chỉnh sửa mã (Dùng thử)

Với trình chỉnh sửa mã trực tuyến của chúng tôi, bạn có thể chỉnh sửa mã và xem kết quả trong trình duyệt của mình

Video

Tìm hiểu những điều cơ bản về HTML qua video hướng dẫn thú vị và hấp dẫn

Mẫu

Chúng tôi đã tạo một loạt mẫu trang web đáp ứng mà bạn có thể sử dụng - miễn phí!

Web hosting

Lưu trữ trang web của riêng bạn và chia sẻ nó với mọi người với Example.com.vn Spaces

Tạo một máy chủ

Tạo máy chủ của riêng bạn bằng Python, PHP, React.js, Node.js, Java, C#, v.v.

Làm thế nào để

Bộ sưu tập lớn các đoạn mã cho HTML, CSS và JavaScript

Khung CSS

Xây dựng các trang web nhanh và phản hồi bằng cách sử dụng khung W3.CSS miễn phí của chúng tôi

Thống kê trình duyệt

Đọc xu hướng dài hạn của việc sử dụng trình duyệt

Tốc độ gõ

Kiểm tra tốc độ đánh máy của bạn

Đào tạo AWS

Tìm hiểu dịch vụ web của Amazon

Bộ chọn màu

Sử dụng công cụ chọn màu của chúng tôi để tìm các màu RGB, HEX và HSL khác nhau. Bánh xe màu hình tròn thể hiện sự chuyển màu trong quang phổ

Trò chơi mã

Trò chơi mã hóa W3Schools! Giúp linh miêu thu thập nón thông Logo Lynx

Đặt mục tiêu

Nhận hành trình học tập được cá nhân hóa dựa trên các kỹ năng và mục tiêu hiện tại của bạn

Bản tin

Tham gia bản tin của chúng tôi và có quyền truy cập vào nội dung độc quyền mỗi tháng

Việc làm

Thuê những tài năng công nghệ hàng đầu. Hợp lý hóa quy trình tuyển dụng của bạn để có đội ngũ phù hợp hoàn hảo

Lớp học

Hãy liên hệ để sử dụng Example.com.vn Plus và các chứng chỉ với tư cách là một tổ chức giáo dục

×
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP CÁCH W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS AN NINH MẠNG DỮ LIỆU KHOA HỌC

Hướng dẫn DSA

DSA TRANG CHỦ DSA Giới thiệu Thuật toán đơn giản DSA

Mảng

Mảng DSA Sắp xếp bong bóng DSA Sắp xếp lựa chọn DSA Sắp xếp chèn DSA Sắp xếp nhanh DSA Sắp xếp đếm DSA Sắp xếp cơ số DSA Sắp xếp hợp nhất DSA Tìm kiếm tuyến tính DSA Tìm kiếm nhị phân DSA

Danh sách liên kết

Danh sách liên kết DSA Danh sách liên kết DSA trong bộ nhớ Danh sách liên kết DSA Các loại Danh sách liên kết Hoạt động

Ngăn xếp & hàng đợi

Ngăn xếp DSA Hàng đợi DSA

Bảng băm

Bảng băm DSA Bộ hàm băm DSA Bản đồ hàm băm DSA

Cây

Cây DSA Cây nhị phân DSA DSA Traversal đặt hàng trước DSA Traversal theo thứ tự DSA Traversal DSA sau thực hiện mảng DSA Cây tìm kiếm nhị phân DSA Cây AVL DSA

Đồ thị

Đồ thị DSA Thực hiện đồ thị Đồ thị DSA Phát hiện chu trình DSA truyền tải

Con đường ngắn nhất

Đường đi ngắn nhất DSA DSA Bellman-Ford của DSA Dijkstra

Cây bao trùm tối thiểu

Cây khung tối thiểu DSA Prim's DSA Kruskal's

Lưu lượng cực đại

DSA Lưu lượng tối đa DSA Ford-Fulkerson DSA Edmonds-Karp

Độ phức tạp thời gian

Giới thiệu Sắp xếp bong bóng Lựa chọn Sắp xếp Chèn Sắp xếp Sắp xếp nhanh Đếm Sắp xếp Cơ số Sắp xếp Hợp nhất Sắp xếp Tìm kiếm tuyến tính Tìm kiếm nhị phân

Tham chiếu DSA

Thuật toán Euclide DSA Thuật toán tham lam DSA Ghi nhớ DSA DSA Người bán hàng du lịch

Ví dụ về DSA

Ví dụ về DSA Bài tập DSA Câu hỏi DSA Chứng chỉ DSA

Sắp xếp chèn DSA


Sắp xếp chèn

Thuật toán Sắp xếp chèn sử dụng một phần của mảng để giữ các giá trị đã được sắp xếp và phần còn lại của mảng để giữ các giá trị chưa được sắp xếp.

Tốc độ:

{{ msgDone }}

Thuật toán lấy một giá trị tại một thời điểm từ phần chưa được sắp xếp của mảng và đặt nó vào đúng vị trí trong phần đã sắp xếp của mảng, cho đến khi mảng được sắp xếp.

Làm thế nào nó hoạt động:

  1. Lấy giá trị đầu tiên từ phần chưa được sắp xếp của mảng.
  2. Di chuyển giá trị vào đúng vị trí trong phần được sắp xếp của mảng.
  3. Đi qua phần chưa được sắp xếp của mảng một lần nữa với số lần có giá trị.

Tiếp tục đọc để hiểu đầy đủ về thuật toán Sắp xếp chèn và cách tự triển khai nó.


Chạy qua thủ công

Trước khi triển khai thuật toán Sắp xếp chèn trong ngôn ngữ lập trình, chúng ta hãy chạy qua một mảng ngắn theo cách thủ công để lấy ý tưởng.

Bước 1: Chúng ta bắt đầu với một mảng chưa được sắp xếp.

[ 7, 12, 9, 11, 3]

Bước 2: Chúng ta có thể coi giá trị đầu tiên là phần được sắp xếp ban đầu của mảng. Nếu nó chỉ là một giá trị thì nó phải được sắp xếp, phải không?

[ 7 , 12, 9, 11, 3]

Bước 3: Giá trị tiếp theo 12 bây giờ sẽ được chuyển vào đúng vị trí trong phần được sắp xếp của mảng. Nhưng 12 cao hơn 7 nên nó đã ở đúng vị trí rồi.

[ 7, 12 , 9, 11, 3]

Bước 4: Xét giá trị tiếp theo 9.

[ 7, 12, 9 , 11, 3]

Bước 5: Giá trị 9 bây giờ phải được di chuyển vào đúng vị trí bên trong phần được sắp xếp của mảng, vì vậy chúng ta di chuyển 9 vào giữa 7 và 12.

[ 7, 9 , 12, 11, 3]

Bước 6: Giá trị tiếp theo là 11.

[ 7, 9, 12, 11 , 3]

Bước 7: Chúng tôi di chuyển nó vào giữa 9 và 12 trong phần được sắp xếp của mảng.

[ 7, 9, 11 , 12, 3]

Bước 8: Giá trị cuối cùng cần chèn vào đúng vị trí là 3.

[ 7, 9, 11, 12, 3 ]

Bước 9: Chúng ta chèn 3 vào trước tất cả các giá trị khác vì đây là giá trị thấp nhất.

[ 3 ,7, 9, 11, 12]

Cuối cùng, mảng được sắp xếp.


Chạy mô phỏng bên dưới để xem các bước ở trên hoạt hình:

{{ msgDone }}
[
{{ x.dieNmbr }}
]

Chạy qua thủ công: Chuyện gì đã xảy ra?

Chúng ta phải hiểu những gì đã xảy ra ở trên để hiểu đầy đủ về thuật toán, để có thể triển khai thuật toán bằng ngôn ngữ lập trình.

Giá trị đầu tiên được coi là phần được sắp xếp ban đầu của mảng.

Mọi giá trị sau giá trị đầu tiên phải được so sánh với các giá trị trong phần được sắp xếp của thuật toán để có thể chèn vào đúng vị trí.

Thuật toán sắp xếp chèn phải chạy qua mảng 4 lần, để sắp xếp mảng 5 giá trị vì chúng ta không phải sắp xếp giá trị đầu tiên.

Và mỗi khi thuật toán chạy qua mảng, phần chưa được sắp xếp còn lại của mảng sẽ trở nên ngắn hơn.

Bây giờ chúng ta sẽ sử dụng những gì đã học để triển khai thuật toán Sắp xếp chèn trong ngôn ngữ lập trình.


Triển khai sắp xếp chèn

Để triển khai thuật toán Sắp xếp chèn trong ngôn ngữ lập trình, chúng ta cần:

  1. Một mảng có các giá trị cần sắp xếp.
  2. Vòng lặp bên ngoài chọn giá trị cần sắp xếp. Đối với một mảng có các giá trị \(n\), vòng lặp bên ngoài này bỏ qua giá trị đầu tiên và phải chạy \(n-1\) lần.
  3. Một vòng lặp bên trong đi qua phần được sắp xếp của mảng để tìm vị trí chèn giá trị. Nếu giá trị cần sắp xếp nằm ở chỉ mục \(i\), thì phần được sắp xếp của mảng bắt đầu ở chỉ mục \(0\) và kết thúc ở chỉ mục \(i-1\).

Mã kết quả trông như thế này:

Ví dụ

 my_array = [64, 34, 25, 12, 22, 11, 90, 5]

n = len(my_array)
for i in range(1,n):
    insert_index = i
    current_value = my_array.pop(i)
    for j in range(i-1, -1, -1):
        if my_array[j] > current_value:
            insert_index = j
    my_array.insert(insert_index, current_value)

print("Sorted array:", my_array)
Chạy ví dụ »

Cải tiến sắp xếp chèn

Sắp xếp chèn có thể được cải thiện thêm một chút.

Cách đoạn mã trên trước tiên loại bỏ một giá trị rồi chèn nó vào một nơi khác rất trực quan. Đó là cách bạn thực hiện Sắp xếp chèn một cách vật lý bằng một ván bài chẳng hạn. Nếu các thẻ có giá trị thấp được sắp xếp ở bên trái, bạn lấy một thẻ mới chưa được sắp xếp và chèn nó vào đúng vị trí giữa các thẻ đã được sắp xếp khác.

Vấn đề với cách lập trình này là khi xóa một giá trị khỏi mảng, tất cả các phần tử ở trên phải được dịch chuyển xuống một vị trí chỉ mục:

Loại bỏ một phần tử khỏi mảng

Và khi chèn lại giá trị đã bị loại bỏ vào mảng, cũng có nhiều thao tác dịch chuyển phải thực hiện: tất cả các phần tử sau phải dịch chuyển lên một vị trí để nhường chỗ cho giá trị được chèn:

Chèn một phần tử vào một mảng

Thao tác dịch chuyển này có thể mất rất nhiều thời gian, đặc biệt đối với mảng có nhiều phần tử.

Lưu ý: Bạn sẽ không thấy các thao tác dịch chuyển này diễn ra trong mã nếu bạn đang sử dụng ngôn ngữ lập trình cấp cao như Python hoặc Java, nhưng các thao tác dịch chuyển vẫn diễn ra ở chế độ nền. Những hoạt động dịch chuyển như vậy đòi hỏi thêm thời gian để máy tính thực hiện, điều này có thể gây ra vấn đề.


Giải pháp cải tiến

Chúng ta có thể tránh hầu hết các thao tác dịch chuyển này bằng cách chỉ dịch chuyển các giá trị cần thiết:

Di chuyển một phần tử trong mảng một cách hiệu quả

Trong hình ảnh trên, giá trị 7 đầu tiên được sao chép, sau đó giá trị 11 và 12 được dịch chuyển lên một vị trí trong mảng và giá trị cuối cùng 7 được đặt ở vị trí trước đó là giá trị 11.

Số lượng thao tác chuyển số giảm từ 12 xuống 2 trong trường hợp này.

Cải tiến này được thực hiện trong ví dụ dưới đây:

Ví dụ

 my_array = [64, 34, 25, 12, 22, 11, 90, 5]

n = len(my_array)
for i in range(1,n):
    insert_index = i
    current_value = my_array[i]
    for j in range(i-1, -1, -1):
        if my_array[j] > current_value:
            my_array[j+1] = my_array[j]
            insert_index = j
        else:
            break
    my_array[insert_index] = current_value

print("Sorted array:", my_array)
Chạy ví dụ »

Điều cũng được thực hiện trong đoạn mã trên là thoát ra khỏi vòng lặp bên trong. Đó là vì không cần tiếp tục so sánh các giá trị khi chúng ta đã tìm đúng vị trí cho giá trị hiện tại.


Độ phức tạp của thời gian sắp xếp chèn

Để có giải thích chung về độ phức tạp của thời gian, hãy truy cập trang này .

Để được giải thích kỹ lưỡng và chi tiết hơn về độ phức tạp về thời gian Sắp xếp chèn, hãy truy cập trang này .

Sắp xếp lựa chọn sắp xếp một mảng các giá trị \(n\).

Trung bình, mỗi giá trị phải được so sánh với khoảng \(\frac{n}{2}\) giá trị khác để tìm ra vị trí cần chèn giá trị đó.

Và Sắp xếp lựa chọn phải chạy vòng lặp để chèn một giá trị vào đúng vị trí của nó khoảng \(n\) lần.

Chúng tôi nhận được độ phức tạp về thời gian cho Sắp xếp chèn:

\[ O( \frac{n}{2} \cdot n) = \underline{\underline{O(n^2)}} \]

Độ phức tạp về thời gian của Sắp xếp chèn có thể được hiển thị như sau:

Độ phức tạp về thời gian để sắp xếp chèn

Sử dụng mô phỏng bên dưới để xem độ phức tạp về mặt lý thuyết \(O(n^2)\) (đường màu đỏ) so với số lượng thao tác của Sắp xếp chèn thực tế.

{{ this.userX }}

Hoạt động: {{ hoạt động }}

Đối với Sắp xếp chèn, có sự khác biệt lớn giữa các trường hợp tốt nhất, trung bình và trường hợp xấu nhất. Bạn có thể thấy điều đó bằng cách chạy các mô phỏng khác nhau ở trên.

Tiếp theo là Quicksort. Cuối cùng chúng ta sẽ thấy một thuật toán sắp xếp nhanh hơn!



×

Liên hệ bán hàng

Nếu bạn muốn sử dụng dịch vụ của Example.com.vn với tư cách là một tổ chức giáo dục, nhóm hoặc doanh nghiệp, hãy gửi email cho chúng tôi:
[email được bảo vệ]

Báo cáo lỗi

Nếu bạn muốn báo cáo lỗi hoặc nếu bạn muốn đưa ra đề xuất, hãy gửi email cho chúng tôi:
[email được bảo vệ]

Example.com.vn được tối ưu hóa cho việc học tập và đào tạo. Các ví dụ có thể được đơn giản hóa để cải thiện khả năng đọc và học. Các hướng dẫn, tài liệu tham khảo và ví dụ liên tục được xem xét để tránh sai sót, nhưng chúng tôi không thể đảm bảo tính chính xác hoàn toàn của mọi nội dung. Khi sử dụng W3Schools, bạn đồng ý đã đọc và chấp nhận các điều khoản sử dụng , chính sách cookie và quyền riêng tư của chúng tôi.

Bản quyền 1999-2024 của Refsnes Data. Đã đăng ký Bản quyền. Example.com.vn được cung cấp bởi W3.CSS .