Sorting and searching

- 4 mins

Introduction

Các thuật toán sắp xếp

Selection sort

Thuật toán chia mảng đầu vào thành 2 phần:

Ban đầu, sorted sublist rỗng, unsorted sublist chứa toàn bộ mảng đầu vào. Thuật toán tìm phần tử lớn nhất (nhỏ nhất tùy theo yêu cầu bài toán) thêm vào mảng sorted hoặc đổi chỗ với phần từ tận cùng bên trái của mảng sorted, tùy theo cách làm. Sau đó lưu vị trí đánh dấu bắt đầu từ unsorted sublist tăng lên 1 đơn vị về bên phải (vì phần từ được sắp xếp ta thêm dần vào bên trái nhất). Độ phức tạp O(n^2) vì phải duyệt qua toàn bộ phần tử của mảng và duyệt qua mảng con để tìm phần tử lớn nhất hoặc nhỏ nhất, thuật toán này không áp dụng trong thực tế do độ phức tạp quá lớn.

Bubble sort (sinking sort)

Thuật toán sắp xếp các cặp phần tử và đổi chỗ nếu 2 phần tử đặt sai chỗ. Việc so sánh lặp lại cho đến khi mảng được sắp xếp. Độ phức tạp tính toán cũng là O(n^2) do duyệt qua toàn bộ phần tử và duyệt qua các phần tử từ một phần tử mốc.

Insertion sort

Thuật toán sắp xếp theo logic tự nhiên. Lặp lại qua một mảng, chọn vị trí đúng cho mỗi phần tử và chèn phần tử vào đúng vị trí. Độ phức tạp tính toán là O(n^2) trong trường hợp phải đảo ngược lại toàn bộ mảng. Best-case của thuật toán là omega(n) khi các phần tử đã nằm đúng vị trí.

Space complexity của các thuật toán này là O(1) do thay đổi vị trí tại chỗ

Merge sort

Thuật toán sắp xếp divide and conquer bằng cách chia mảng thành 2 nửa, sắp xếp mỗi nửa và merge lại với nhau. Trường hợp atomic (base case) của divide and conquer lúc này là mỗi mảng con có kích thước bằng 1. Phần xử lý phức tạp nhất dễ thấy nằm ở việc merge 2 mảng con lại với nhau. Merge sort gọi đệ quy trên mỗi nửa mảng được chia. RightIndex và LeftIndex tạm gọi là chỉ số của đầu tiên và cuối cùng của nửa mảng phải và trái. Trường hợp atomic đạt được khi phần tử [rightIndex] <= phần tử [leftIndex] thì dừng lại. Sau đó, hàm merge được gọi để merge 2 nửa mảng với nhau.

Độ phức tạp tính toán là O(nlogn)

Quick sort

Quick sort là thuật toán nhanh nhất so với các thuật toán sắp xếp khác trong trường hợp cơ bản. Merge sort hoạt động tốt hơn trên linked list. Các thuật toán sắp xếp không dựa trên so sánh hoạt động tốt hơn quick sort

Các bước thực hiện:

Các trường hợp chọn phần tử pivot:

Cách chọn pivot:

Độ phức tạp tính toán xấu nhất là O(n^2), trung bình độ phức tạp tính toán là O(nlogn) với giả sử phân phối các phần tử đồng đều và chọn ngẫu nhiên pivot. Trường hợp tốt nhất thì độ phức tạp là O(logn).

Quick sort và merge sort:

comments powered by Disqus
rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora