THUẬT TOÁN SẮP XÉP
Phương pháp chọn trực tiếp Selection Sort
A = {8, 3, 7, 6, 2, 5} va n=6
Tại mỗi giá trỊ 1, tìm giá trị nhỏ nhất A[min] trong đoạn [I+l, n-Ï] và hoán vị A[min] với A[I]
Bước 1: Tai i=0: khoi tao min=i=0 va tim gia tri nho hon min trong doan [1,5]
> min=4 > hoan vi A[4] voi A[0]
Bwéoc 2: Tai i=1: khoi tao min=i=1 và tìm gia tri nho hon min trong doan [2,5]
> min=!1 > hoan vi A[1] = A[1]
Bước 3: Tại 1=2: khởi tạo min=I=2 và tìm gia tri nho hon min trong doan [3,5]
> min=5 > hoán vị A[5] = A[2]
Bước 4: Tai i=3: khoi tao min=i=3 va tim gia tri nho hon min trong doan [4,5]
> min=3 > hoan vi A[3] = A[3]
Trang 2Bước 5: Tại 1=4: khởi tạo min=I=4 và tìm gia tri nho hon min trong doan [5,5]
> min=5 > hoán vị A[5] = A[4]
Phương pháp chèn trực tiếp Insertion sort
A = {8, 3, 7, 6, 2, 5} va n=6
Bước 1: Chèn A[I |E3=e vào đoạn [0,0] sao cho ta duoc doan [0,1] c6 thir tu
Bước 2: Chen A[2]=7 vao doan [0,1] sao cho ta duoc doan [0,2] co thir tu
Trang 3
Phương phap dém Counting Sort
Mang A = {8, 3, 7, 6, 8, 5}
0 1 2 3 4 5
NI
Bước 1: Khởi tạo giá trị các phần tử của mảng B = {0}
5
Mang B | 0 | 0 01010 0 0 0 0
Bước 2: Gán gia tri B[A[i]]++
Mang B | 0 | 0 0|110 I I I 2
Bwoc 3: Thuc hién B[i]=B[i] + B[i-1]
Mang B | 0 | 0 O;1}1 2 3 4 6
Bước 4: Duyệt ¡ = 5 > 0, tại mỗi giá trị của ¡ thực hiện:
BỊAIHII- CIBIAHIII = AI
Trang 4
1=U: > B[A[ï]lEB[8]-1=5-1=4 Mang B | 0} 0} 0 O 123 45 67 8 > C[4] =8
Trang 5
Phương pháp cơ số Radix Sort
Giả sử A={352, 9, 286, 83, 177}, m = 3, k=10 và thứ tự cân sắp xếp < (tăng dân)
4
Sắp xếp | Hàng đơn vị | Hàng chục | Hàng trăm
Hàng đơn vi: 352, 83, 286, 177, 9
Hang chuc : 9, 352, 177, 83, 286
Thuật toán sắp xếp
- - Tên thuật toán: TA, TV
- Y tưởng, độ phức tạp thuật toán
- _ Thuật toán: input / Output và các bước thuật toán
- _ Code trên mảng I chiều hoặc trên dslk
- _ Quá trình tính toán
Trang 6Thuật toán sắp xếp (tiếp theo)
HEAP SORT
A={12,2,8,5,1,6,4, 15}
Phần tử liên đới của ¡ 3 (2*i + 1, 2*i + 2)
Alil> A[2*i + 1]
Alil> A[2*i + 2]
Hiệu chỉnh và săp xêp trên đoạn n=8
Bước l: Hiệu chỉnh và sắp xếp trên mảng A = {12, 2, 8, 5, 1, 6, 4, 15}, n=8 lần lượt từng
vi tri i tir n/2 -1 đến 0
Taii=3
0
12
0
12
5
Trang 7
Khi hoán vị 2 và 15 làm ảnh hưởng đến nhánh
bên dưới 2 trở thành node cha của 5 Cần hiệu
chỉnh tiếp nhánh bên dưới sao cho thõa đk
A[il > A[2*i + 1] và A[i] > A{2*i + 2|
Đây gọi là hiệu chỉnh lan truyền
15, 12,8, 5, 1,6, 4, 2 hoán vị vị trí đầu cuối 2, 12, 8, 5, 1,6, 4, 15
Trang 8Bước 2: Hiệu chỉnh và sắp xếp trên mảng A = {2, 12, 8, 5, 1, 6, 4}, n=7 lần lượt từng vị
tríi = n⁄2 -l 0
Taii=0O
0
12
12,5, 8, 2, 1, 6, 4 hoán vị vị trí đầu cuối > 4, 5, 8, 2, 1, 6, 12
Trang 9Bước 3: Hiệu chỉnh và sắp xếp trên mang A = {4, 5, 8, 2, 1, 6}, n=6 lần lượt từng vị trí i
= n2 -l >0
0
1 ———
5 1 8 2
2 1 3 3 4 5 4
8,5,6, 2, 1,4 hoán vị vị trí đầu cuối > 4, 5, 6, 2, 1,8
Trang 10Bước 4: Hiệu chỉnh và sắp xếp trên mảng A = {4, 5, 6, 2, 1}, n=5 lần lượt từng vị trí ¡ =
n2 -lI >0
0
6
6,5, 4, 2, | hodn vi vi tri dau cuéi > 1,5, 4, 2, 6
Tương tự các bước còn lại ta có kết quả mang A đã được sắp xếp
A= {1, 2, 4,5, 6, 8, 12, 15}
Trang 11QUICK SORT
A= {12, 2, 8,5, 1, 6,4, 15}
Left = 0 ] 2 3 4 5 6 Right = 7
Chon tity y phan ttr X trong doan [left, right] > chon phan tir 6 gitra (left+right)/2
Với gia tri khoi tao i = left, trong khi A[i] < X > i++
V6i gid tri khoi tao j = right, trong khi A[j] > X > j—
>> Sau khi tính toán, nếu ¡ < j thì hoán vị A[ï] với A[j]
Bước I1: Xét trên đoạn [0,7] và X = 5
Kết quả tính toán được 1=0 và J=6 © hoán vị (A[0], A[6]) > i=1 va j=5
Két qua tinh todn duoc i=2 va j=4 > hodn vi (A[2], A[4]) > ¡=3 và j=3
Khi i = j > Phan hoach 2 doan [0,3] va [3,7]
Trang 12Bước 2.1: Xét trên đoạn [0,3] va X = 2
Hoán vị (4,1) > Kết quả:
=> i=j > Phan hoach 2 doan [0,1] va [1,3]
Bước 2.1.1: Xét trén doan [0,1] va X = 1
void quickSort(int *a, int left, int right)
if (left >= right) return;
int x = a[(left+right)/2], 1 = left, } = right; while( < J)
~~ |
i=j=0 while (a[i] < x) i++;
whnle (a|J| > x) J ;
1f(left < J) quickSort(a, left, j);
j=-l 0 i=] if < right) quickSort(a, 1, right);
1 2
>> dừng phân hoạch do left > j vai = right
Bước 2.1.2: Xét trên đoạn [1,3] và X = 4
Bước 2.2: Xét trên đoạn [3,7] và X = 6
i=3 i=4 j=5 6 j=7
Hoán vị (8,6) > Kết quả:
3 j=4 i=5 6 7
=> i>j 7 Phan hoach 2 doan [3,4] va [5,7]
Bước 2.2.1: Xét trén doan [3,4] va X =5
Bước 2.2.2: Xét trén doan [5,7] va X = 8