Vai trò c ủa sắp xếp 1/2 Nếu các đối tượng trong một mảng nào đó đã được sắp theo trật tự nào đó, có thể truy xuất thông tin nhanh chóng và chính xác... Các v ấn đề của sắp xếp Với cùn
Trang 1Lecturer: PhD Ngo Huu Phuc
Tel: 0438 326 077 Mob: 098 5696 580 Email: ngohuuphuc76@gmail.com
Bài 5 Phương pháp sắp xếp đơn giản
Trang 2Bài 5: Các phương pháp sắp xếp đơn giản
1 Lecture 16 Introduction to Sorting.htm
2 Data Structures and Algorithms Sorting.htm
3 Tham kh ảo bài giảng của TS Nguyễn Nam Hồng
Trang 35.1 Khái ni ệm và vai trò của sắp xếp
Trang 45.1.1 Các thu ật toán sắp xếp (1/2)
Th ế nào là sắp xếp?
Đưa một dãy các đối tượng về dạng thứ bậc nào đó.
Gi ải thuật sắp xếp dựa trên sự so sánh nào đó.
Việc sắp xếp chỉ dựa trên phép toán so sánh
Các phép toán cơ bản của sắp xếp.
So sánh
Tráo đổi giữa các phần tử
Trang 5ố phần tử cần sắp xếp.
Trang 65.1.2 Vai trò c ủa sắp xếp (1/2)
Nếu các đối tượng trong một mảng nào đó đã được sắp theo trật tự nào đó, có thể truy xuất thông tin nhanh chóng
và chính xác
Việc xây dựng giải thuật cho phép sắp xếp từng phần tử
của mảng sẽ mất nhiều thời gian, độ phức tạp của giải
≈ 250,000,000 bước cho việc sắp một mảng có 10,000,000 phần tử
⇒ 2.5 giây, với máy tính có thể thực hiện 100 triệu phép tính
Trang 75.1.2 Vai trò c ủa sắp xếp (2/2)
Như vậy, sắp xếp là giải thuật cơ bản.
Thông thường, 25% khả năng của CPU dành
cho vi ệc sắp xếp.
S ắp xếp là bước cơ bản cho một số giải thuật
khác, ví d ụ: tìm kiếm nhị phân.
Có nhi ều cách tiếp cận đến giải thuật sắp xếp,
t ừ đó, có nhiều giải thuật săp xếp khác nhau.
Trang 85.1.3 Các v ấn đề của sắp xếp
Với cùng một giải thuật sắp xếp, có thể dùng cho cả sắp theo trật tăng hay giảm, bằng việc thay đổi phép so sánh:
<= và >=
Có thể dùng nhiều khóa cho cùng một giải thuật sắp xếp
Cần lưu ý đến ý tưởng của bài toán
Với chuỗi, sử dụng phép so sánh chuỗi, từ điển, hay quy
tắc nào đó
Ví dụ: Sắp chuỗi Brown-Williams, Brown America, Brown,
John?
Trang 105.1.4 M ột số ứng dụng của sắp xếp (2/2)
Các t ừ trong từ điển đã được sắp xếp.
Thông thường, các Files trong thư mục được sắp theo m ột trật tự nào đó.
Trong thư viện, các quyển sách được sắp theo
Trang 11 Tráo đổi - Exchange: với mỗi cặp các phần tử, tráo đổi
chúng về đúng thứ tự, thực hiện cho đến khi không còn cặp nào chưa đưa về đúng thứ tự
Ch ọn - Selection: chọn phần tử lớn nhất (nhỏ nhất) trong danh sách, đưa về đúng vị trí
Phân lo ại - Distribution: chia nhỏ thành nhiều mảnh dựa trên tiêu chí nào đó, sau đó sắp từng mảnh
H ợp - Merging: có thể nối 2 dãy đã sắp xếp thành 1 dãy được sắp xếp
Trang 12 Th ực hiện cho đến khi các phần tử đều được xét.
V ới mỗi phần tử, chèn chúng vào mảng con đã sắp đúng trật
t ự.
Th ực hiện tương tự cho các phần tử còn lại.
Tìm 2 ph ần tử trong dãy không đúng trật tự, tráo đổi vị trí của chúng.
Gi ữ lại danh sách đã hiệu chỉnh.
Trang 135.1.6 Phân tích hi ệu quả của giải thuật
Có thể truy xuất ngẫu nhiên được không?
Có cần thêm thao tác nào không ngoài “so sánh” và
“tráo đổi”?
Trang 145.1.6 Phân tích hi ệu quả của giải thuật
Tính ổn định:
Thu ật toán có tính ổn định không?
S ự hiệu quả, nếu dãy đã gần sắp:
Thu ật toán có hiệu quả hơn nếu như dãy đã cho
g ần được sắp? (nhiều phần tử đã đúng thứ tự,
ch ỉ có một số chưa đúng thứ tự)
Trang 155.2 S ắp xếp chèn (1/6)
Ví d ụ minh họa:
Xem xét người chơi bài (sắp theo chiều giảm dần)
Quân bài th ứ nhất được sắp.
V ới các quân bài còn lại:
Tìm t ừ cuối dãy cho đến khi tìm thấy quân bài lớn hơn quân bài
m ới,
Di chuy ển các quân bài nhỏ về sau một bậc
Chèn quân bài m ới vào vị trí đó.
Trang 16 Vùng đã sắp bắt đầu từ phần tử đầu tiên của dãy.
L ấy phần tử đầu tiên của vùng chưa sắp và chèn vào vùng đã sắp.
Như vậy, vùng đã sắp sẽ có thêm một phần tử.
Th ực hiện tương tư cho đến khi vùng chưa sắp không còn phần tử nào.
Trang 175.2 S ắp xếp chèn (3/6)
được chèn
Giá tr ị 5 nhỏ hơn 8, 5 sẽ thay thế cho 8, dãy đã sắp sẽ có kích thước
tăng lên 1 (có 2 phần tử đã được sắp.
Gi ả sử: Sắp xếp dãy các số nguyên theo phương pháp chèn
Ho ạt động của
Trang 185.2 S ắp xếp chèn (4/6)
#include <stdio.h>
#include <conio.h>
#define MAX 100
void inputdata( int * list, int n);
void printlist( int * list, int n);
void insertionsort( int * list, int n);
printf("\n");
}
Trang 19} list[pos+1]=x;
}
Trang 205.2 S ắp xếp chèn (6/6)
Phân tích s ắp xếp chèn:
Trường hợp tồi nhất:
V ới dữ liệu dạng nào cho kết quả tồi nhất?
D ữ liệu được sắp theo chiều ngược lại.
Độ phức tạp trong trường hợp này?
O (N2) – phép so sánh: N2, phép tráo đổi: N2
Trường hợp tốt nhất:
V ới dữ liệu dạng nào cho kết quả tốt nhất?
D ữ liệu đã được sắp.
Độ phức tạp trong trường hợp này?
O (N) – phép so sánh: N, phép tráo đổi: none
Trường hợp trung bình:
V ới dữ liệu dạng nào cho kết quả trung bình?
D ữ liệu dạng ngẫu nhiên.
Độ phức tạp trung bình?
O (N2) – phép so sánh: N2, phép tráo đổi: N2
Trang 215.3 S ắp xếp chọn (1/5)
Đây cũng là phương pháp sắp xếp đơn giản
Tại mỗi bước, chọn phần tử lớn nhất (nhỏ nhất) trong số
phần tử chưa sắp và đưa về đúng vị trí
Ý t ưởng : (v ới sắp xếp tăng dần)
Bước 1: Tìm phần tử nhỏ nhất trong dãy và đưa nó về vị trí đầu tiên của dãy
Bước 2: Tìm phần tử nhỏ thứ hai và đưa nó về vị trí thứ 2 trong dãy
Bước tiếp: Lặp lại quá trình trên cho đến khi tất các phần
tử đã sắp đúng thứ tự
Trang 22Tráo đổi nó với phần tử đầu tiên
c ủa dãy, phần tử có giá trị 6.
Tìm ph ần tử nhỏ nhất trong số
có giá tr ị 3 và trao đổi nó với
ph ần tử đứng thứ 2 trong dãy, có giá tr ị 4.
Gi ả sử, cho 5 phần tử như sau, chưa sắp Sắp lại dãy số trên theo
phương pháp sắp xếp chọn.
Ho ạt động của Selection Sort
Trang 235.2 S ắp xếp chọn (3/5)
#include "stdio.h"
#include "conio.h"
#define MAX 100
void swap( int *x, int *y);
void selectionsort( int list[], int n);
void inputdata( int list[], int n);
void printlist( int list[], int n);
printf("Mang da sap xep:\n");
void inputdata( int list[], int n) {
int i;
printf("Nhap cac phan tu cua mang\n");
for (i=0;i<n;i++) scanf("%d",&list[i]);
Trang 265.4 S ắp xếp nổi bọt - Bubble Sort (1/5)
S ắp xếp nổi bọt là k ỹ thuật sắp xếp đơn giản, trong kỹ thu ật này tổ chức các phần tử của mảng thành các
c ặp liền kề.
V ới các cặp liền kề, thứ i và thứ i+1, đổi chỗ các phần
t ử này nếu chúng không đúng trật tự sắp xếp Sau mỗi
l ần thực hiện việc đổi chỗ, ta thu được 1 phần tử đã ở đúng vị trí.
Th ực hiện lặp lại quá trình trên cho n-1 phần tử còn lại.
Thu ật toán dừng khi không còn cặp nào sai vị trí.
Trang 275.4 S ắp xếp nổi bọt (2/5)
3 2 2 2
2 3 3 3
4 4 4 1
1 1 1 4
5 5 5 5
2 2 2
3 3 1
1 1 3
4 4 4
5 5 5 2 1
1 2
3 3
4 4
1 2
3 4
Trang 285.2 S ắp xếp nổi bọt (3/5)
#include <stdio.h>
#include <conio.h>
#define MAX 100
void inputdata( int list[], int n);
void printlist( int list[], int n);
void swap( int *x, int *y);
void bubblesort( int list[], int n);
printf("\n");
}
Trang 305.4 S ắp xếp nổi bọt (5/5)
Phân tích hi ệu quả của thuật toán sắp xếp nổi bọt:
Độ phức tạp:
Trong trường hợp tồi nhất: O(n 2 )
Trong trường hợp trung bình: O(n 2 )
Đối với dữ liệu:
D ữ liệu cho phép truy cập ngẫu nhiên.
C ần có phép toán so sánh và tráo đổi.
Đối với dữ liệu đã gần được sắp:
S ố phép tráo đổi có thể ít, nhưng số phép so sánh nhiều Tổng quát, không t ốt hơn so với dữ liệu random.
Trang 31 Các giải thuật này được thực hiện với dữ liệu cho phép truy
cập ngẫu nhiên (sắp xếp trong)
Độ phức tạp trong trường hợp trung bình là O(n2)
Trong bài 6, giới thiệu một số giải thuật sắp xếp cho hiệu