Professional Documents
Culture Documents
MSSV: 19120728
Lớp: 19CTT4C
VD:
Đánh giá thuật toán:
Trường hợp tốt: O(n)
Trung bình: O(n^2)
Trường hợp xấu: O(n^2)
Không gian bộ nhớ sử dụng: O(1)
7. Binary-Insertion Sort
Ý tưởng: Binary Insertion Sort cũng tương tự như Insertion Sort, chỉ
khác ở cách tìm vị trí thích hợp pos trong đoạn a[0] đến a[i-1]. Do
đoạn a[0] đến a[i-1] đã có thứ tự nên ta có thể sử dụng giải thuật tìm
nhị phân (Binary Search) để thực hiện việc tìm vị trí pos.
Thuật toán:
Bước 1: i = 2 // Giả sử có đoạn a[1] đã được sắp
Bước 2: x = a[i]; Tìm vị trí pos thích hợp trong đoạn a[1] đến
a[i-1] để chèn a[i] vào.
Bước 3: Dời chỗ các phần tử từ a[pos] đến a[i-1] sang phải 1
vị trí để dành chỗ cho a[i].
Bước 4: a[pos] = x; // có đoạn a[1]…a[i] đã được sắp
Bước 5: i = i +1;
Nếu i ≤ n: lặp lại bước 2.
Ngược lại: Dừng
VD:
Đánh giá thuật toán:
Trung bình: O(n^2)
Xấu nhất: O(n^2)
Tốt nhất: O(n)
Bộ nhớ: O(n)
Randomized Input
140000
120000
Runtime in milliseconds
100000 Selection
Merge
80000
Heap
60000
QuickSort
40000 Bubble
Insertion
20000
Binary-Insertion
0
3000 10000 30000 100000 300000
Input Size
Ngẫu nhiên
Nhận xét:
Cùng chia sẻ vị trí đầu bảng lần lượt là Quicksort, Heapsort và
Mergesort
Chót bảng là 2 người anh em nổi tiếng Bubblesort và Selectionsort
(trong đó Bubble chạy chậm nhất)
2. Gần như có thứ tự tăng dần
30000
Runtime in milliseconds
25000 Selection
Merge
20000
Heap
15000
QuickSort
10000 Bubble
Insertion
5000
Binary-Insertion
0
3000 10000 30000 100000 300000
Input Size
Nhận xét:
Cùng đứng đầu bảng (thời gian chênh lệch không đáng kể) lần lượt
là Insertion, Quicksort, Binary-Insertion, Heapsort và Mergesort
(trong đó Insertion chạy nhanh nhất)
Chót bảng lần lượt là Selection và Bubble (Bubble chạy chậm nhất)
Insertion chạy cực nhanh trong trường hợp mảng được sắp xếp 1
phần
3. Có thứ tự tăng dần
Sorted Input
30000
25000
Runtime in milliseconds
Selection
20000
Merge
15000 Heap
QuickSort
10000
Bubble
Insertion
5000
Binary-Insertion
0
3000 10000 30000 100000 300000
Input Size
Tăng dần
Nhận xét:
Gần tương tự như trường hợp mảng được sắp xếp 1 phần, đứng
đầu bảng (thời gian chênh lệch không đáng kể) tiếp tục lần lượt là
Insertion, Quicksort, Binary-Insertion, Heapsort và Mergesort (trong
đó Insertion chạy nhanh nhất)
Chót bảng vẫn lần lượt là Selection và Bubble (Bubble chạy chậm
nhất)
Insertion tiếp tục cho thấy tốc độ chạy cực nhanh trong trường hợp
mảng được sắp xếp tăng dần
4. Thứ tự ngược (giảm dần)
Reverse Input
80000
70000
Runtime in milliseconds
60000
Selection
50000 Merge
40000 Heap
QuickSort
30000
Bubble
20000
Insertion
10000 Binary-Insertion
0
3000 10000 30000 100000 300000
Input Size
Giảm dần
Nhận xét:
Quicksort, Heapsort và Merge cùng đứng đầu bảng cho thấy tốc độ
chạy vượt trội của mình so với các thuật toán khác
Bubble tiếp tục chạy chậm nhất
Insertion đứng gần áp chót bảng, khi mảng không còn được xếp
tăng dần thì Insertion chạy tương đối chậm
Nhận xét chung:
Với số lượng phần từ 3000, 10000 và 30000 thì thời gian chạy của các
thuật toán không có nhiều sự khác biệt (vì quá nhỏ), bắt đầu có sự chênh
lệch nhẹ khi nâng số lượng phần tử lên 100000 và chênh lệch rõ ràng khi
lên tới 300000 phần tử
Với số lượng phần tử từ 30000 trở xuống thì thời gian chạy của các thuật
toán là không đáng kể nên cần lựa chọn thuật toán đơn giản nhất, tránh
các thuật toán chiếm không gian, phức tạp và dễ gặp lỗi
Nhìn chung thì Quicksort, Heapsort và Mergesort chạy nhanh trong tất cả
các trường hợp, Insertion và Binary-Insertion chạy cực nhanh khi mảng
được sắp xếp 1 phần hoặc toàn bộ, còn Bubblesort, Selectionsort chạy rất
chậm khi số lượng phần tử lớn
Các thuật toán hiệu suất cao: Heapsort, Mergesort, Quicksort
Các thuật toán hiệu suất thấp: Bubblesort, Selectionsort
Các thuật toán có code phức tạp: Heapsort, Mergesort, Quicksort, Binary-
Insertion
Các thuật toán có code đơn giản: Selectionsort, Bubblesort, Insertionsort