Professional Documents
Culture Documents
Bài Thuyết Trình
Bài Thuyết Trình
O S ALGORITH
R T I N G Giảng viên hướng dẫn {
O S ALGORITH
R T I N G Giảng viên hướng dẫn {
O S ALGORITH
R T I N G Giảng viên hướng dẫn {
Như ví dụ ở phần giới thiệu , chúng ta có thể thấy được sự quan trọng của sự sắp xếp
Sự sắp xếp giúp chúng ta hiểu được nội dung vấn đề, dễ dàng hơn
trong công việc
1.Giới thiệu
Trong cuộc sống hàng ngày các đối tượng luôn đuợc sắp xếp theo trật tự nào đó: Theo thời gian,
theo chiều cao, cận nặng, theo học lực, theo chất lượng v.v... Các tiêu chí sắp xếp đó là khoá của
sắp xếp.
1.Giới thiệu
Nhưng trong thực tế việc sắp xếp mất rất nhiều thời gian nhất là với những công việc sắp xếp bao gồm rất nhiều dữ
liệu lớn , hơn nữa việc sắp xếp thủ công còn rất dễ xảy ra sai sót nên cần 1 giải pháp nào đó cho công việc này ? ? ? ?
???
Vì vậy các giải thuật sắp xếp đã được phát minh ra , và các thuật
toán này hoàn toàn dựa vào ý tưởng của con người trong cuộc
sống hàng ngày.
2.Các thuật toán sắp xếp
2.1 thuật toán sắp xếp nổi bọt (bubble Sort)
Ý tưởng của thuật toán
• Bubble Sort là thuật toán sắp xếp đơn giản nhất hoạt động bằng cách hoán đổi nhiều lần các phần tử liền kề nếu chúng sai thứ tự.
}
}
void selectionSort(int[] arr){
for(int i = 0; i < arr.length - 1; i++)
{
int index = i;
for (int j = i + 1; j < arr.length; j++){
if (arr[j] < arr[index]){
index = j;
}
}
int min= arr[index];
arr[index] = arr[i];
arr[i] = min;
}
}
• Độ phức tạp thuật toán: O(n2) (là trường hợp trung bình) và cũng là trường hợp xấu
• Ưu điểm : dễ triển khai thuật toán, Thuật toán ít phải đổi chỗ các phần tử nhất trong số các thuật toán sắp xếp(n lần hoán vị)
• Nhược điểm : khi phân tích thuật toán trường hợp trung bình có cùng độ phức tạp với trường hợp xấu nhất
2.Các thuật toán sắp xếp
2.2 thuật toán sắp xếp chèn (insertionSort)
• Sắp xếp chèn (insertion sort) là một thuật toán sắp xếp bắt chước cách sắp xếp quân bài của những người chơi bài. Muốn
sắp một bộ bài theo trật tự người chơi bài rút lần lượt từ quân thứ 2, so với các quân đứng trước nó để chèn vào vị trí thích
hợp.
Ví dụ về cài đặt thuật toán bằng mảng
void insertionSort(int[] arr){
for(int i = 1; i < arr.length; ++i)
{
int key = arr[i];
int j= i – 1;
while(j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j -1;
}
arr[j + 1] = key;
}
}
return i + 1;
}
public static void quickSort(int arr[], int low, int high) {
if (low < high) {
/*
* pi is partitioning index, arr[pi] is now at right place
*/
int pi = partition(arr, low, high);
• Heapsort dựa trên một cấu trúc dữ liệu được gọi là đống nhị phân (binary heap), gọi đơn giản là đống.
Ý tưởng của thuật toán
• Khái niệm đống nhị phân: Mỗi mảng a[1..n] có thể xem như một cây nhị phân gần đầy
• vun đống:Việc sắp xếp lại các phần tử của một mảng ban đầu sao cho nó trở thành đống được gọi là vun đống.
Thủ tục Heapify chỉ có thể được áp dụng cho một nút
nếu các nút con của nó được “vun đống”. Vì vậy việc
vun đống phải được thực hiện theo thứ tự từ dưới lên.
//code minh họa thuật toán heapSort
public static void heapSort(int arr[]) {
int n = arr.length;
if (largest != i) {
int swap = arr[i];
arr[i] = arr[largest];
arr[largest] = swap;
Chúng ta có thể được cài đặt các thuật toán sắp xếp trên bằng các kiểu dữ liệu khác nhau, đó là các kiểu :
. Array: Với mảng trong java chúng ta chỉ có thể lưu trữ một tập các phần tử có số lượng phần tử cố định.Mảng trong java lưu
các phần tử theo chỉ số, chỉ số của phần tử đầu tiên là 0.
.ArrayList: là một lớp kế thừa lớp AbstractList và triển khai của List Interface trong Collections Framewor
.LinkedList: là một lớp kế thừa lớp AbstractSequentialList và triển khai của List
Ta thấy như bảng dưới thì thời gian cài đặt của các thêm vào chèn Lấy ra xóa Set
kiểu dữ liệu khác nhau vì thế khi chúng ta sử dụng các
Array O(1) O(n) O(1) O(n) O(1)
kiểu dữ liệu khác nhau sẽ cho ra thời gian khác nhau
trên cùng một số phần tử cần sắp xếp Arraylist O(1) O(n) O(1) O(n) O(1)
Vd: việc cài đặt kiểu Array sẽ nhanh hơn kiểu LinkList O(1) O(n) O(n) O(n) O(n)
Arraylist bởi vì kích thước cố định còn thao tác thay
đổi kích thước trong arraylist làm chậm hiệu suất của
nó
Vì Vậy chúng ta sẽ cùng xem biểu đồ thể hiện thời gian chạy của các thuật toán sắp xếp được cài đặt bằng các kiểu dữ
liệu khác nhau sau đây
Bảng số liệu thời gian khi chạy thuật toán sắp xếp cài đặt bằng Mảng
3. So sánh thời gian chạy của các thuật toán
13,6
THỜI GIAN CHẠY CÁC THUẬT TOÁN KHI CÀI ĐẶT BẰNG
2,43
MẢNG
3,31 1,13
11
0,6
0.0769
2 53 0,278
0.0
Time(s)
0.0146
644
0.00 0.0118
0.000613
0 3
.0 003 0.00281
0.000319 0
15
0.0002
0.0000658
87
0.0000555 0.00003 0.000133
0.000154
0.0000198 0.0000374
0.0000112
0 50 100 500 1000 5000 10000 50000 100000
Element size
1,16
THỜI GIAN CHẠY CÁC THUẬT TOÁN KHI CÀI ĐẶT BẰNG
MẢNG
0,812
56
0,3
Time(s)
5
0,541
30
0,
53
0,1
48
0,1 04
718 0,2
0.0
04
0.07 8
0.01
12 0.097
6
0.012 27 0.0467
0.0000598 0.00537
0.000108 0.000912 0.008
0.00389
0.000117 0.00102 0.000657 0.00616
0 1000 10000 50000 100000 500000 1000000 2000000 5000000
Element size
,6
12
10
Time(s)
4,87
8
2,2
1,11
1
49
9
7
0,3
0. 0
0.0829
0.00254 0.00349 0.0188
0.000178 0.000568 0.00785 8
0.000398 0.00168 0. 030
0.0000847 0.000185 0.00105 0.00638 0.00757
0.0000539
THỜI GIAN CHẠY CÁC THUẬT TOÁN KHI CÀI ĐẶT BẰNG 8,73
ARRAYLIST
5,25
3,72
Time(s)
3
2,1
5 8
0,9
2
0,84
0,265
22
5 8
0,3
0, 6
0,120
0 .0 5
3
0.024 0,2 70
0.0197 0.0680 0,121
0.000321 0.00316 0.0213
0.00168 0.0653
0.00525 0.00227
0.00038
0 1000 10000 50000 100000 500000 1000000 2000000 5000000
Element size
THỜI GIAN CHẠY CÁC THUẬT TOÁN KHI CÀI ĐẶT BẰNG
LINKEDLIST
Time(s)
THỜI GIAN CHẠY CÁC THUẬT TOÁN KHI CÀI ĐẶT BẰNG
LINKEDLIST
Time(s)
10,9
6
2.2
0.0137
0,522 5 24
0.00
0.00275 0.0121 0.00318 0.0055
0.000443 0.00124
0.00066
0.0000558 0.000155 0.000488
0.0000251
0 0.00000253 0.0000378 0.0000537 0.000117 0.000442 0.000801 0.00194
1. Không lo lắng về các case đầu vào kể cả trường hợp xấu nhất (trật tự nói chung là ngẫu nhiên)
2. Không quan tâm đến dung lượng bộ nhớ, bộ nhớ là hoàn toàn lý tưởng và phù hợp ở đây
• Nếu dữ liệu đã được sắp xếp sẵn, thì nên chọn Insertion Sort hoặc Shell Sort sẽ tốt hơn.
• Nếu chúng ta thực sự phải loại bỏ case xấu nhất, có thể sử dụng Heap (hoặc ít nhất là Quick3) với độ phức tạp NlogN
• Tim Sort sẽ có độ phức tạp thấp hơn Quick Sort ở cả Best Case lẫn Worse Case, Tim Sort là sự kết hợp của Merge Sort và
Insertion Sort. Python sử dụng thuật toán sắp xếp này là mặc định của họ
• Trong trường hợp, dữ liệu rất ít phần tử (10-20 phần tử), lựa chọn Selection Sort sẽ nhanh hơn Quick Sort
Tóm lại, về lý thuyết thì Quick Sort thật sự là thuật toán sắp xếp nhanh nhất trong phần lớn các trường hợp. Tuy
nhiên, trên thực tế, việc lựa chọn thuật toán sắp xếp dựa vào nhiều yếu tố như dữ liệu đầu vào số lượng như thế
nào, có sắp xếp sẵn hay không, dung lượng bộ nhớ ra sao, tốc độ xử lý CPU...
Cảm ơn thầy , cô và các bạn đã lắng nghe bài thuyết trình của nhóm em