Idea: Chèn từng phần tử vào đúng vị trí trong mảng đã sorted (giống xếp bài trên tay).
def insertionSort(arr):
for i in range(1, len(arr)):
j = i - 1
while j >= 0 and arr[j + 1] < arr[j]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
j -= 1
return arr
# Example
arr = [4, 2, 1]
print(insertionSort(arr)) # [1, 2, 4]
Time: O(n²)
Space: O(1)
Idea: Chia đôi → sort từng nửa → merge lại (Divide and Conquer).
def mergeSort(arr, s, e):
if e - s + 1 <= 1:
return arr
m = (s + e) // 2
mergeSort(arr, s, m)
mergeSort(arr, m + 1, e)
merge(arr, s, m, e)
return arr
def merge(arr, s, m, e):
L = arr[s:m+1]
R = arr[m+1:e+1]
i = j = 0
k = s
while i < len(L) and j < len(R):
if L[i] <= R[j]:
arr[k] = L[i]; i += 1
else:
arr[k] = R[j]; j += 1
k += 1
while i < len(L):
arr[k] = L[i]; i += 1; k += 1
while j < len(R):
arr[k] = R[j]; j += 1; k += 1
# Example
arr = [5, 2, 8, 1]
print(mergeSort(arr, 0, len(arr)-1)) # [1, 2, 5, 8]
Time: O(n log n)
Space: O(n)
Idea: Chọn pivot → chia mảng thành hai phần → đệ quy sort từng phần.
def quickSort(arr, s, e):
if e - s + 1 <= 1:
return arr
pivot = arr[e]
left = s
for i in range(s, e):
if arr[i] < pivot:
arr[left], arr[i] = arr[i], arr[left]
left += 1
arr[e], arr[left] = arr[left], arr[e]
quickSort(arr, s, left - 1)
quickSort(arr, left + 1, e)
return arr
# Example
arr = [3, 6, 1, 4]
print(quickSort(arr, 0, len(arr)-1)) # [1, 3, 4, 6]
Time: O(n log n) average, O(n²) worst
Space: O(log n)
Idea: Đếm số lượng phần tử rồi ghi lại theo thứ tự.