Tải bản đầy đủ (.ppt) (65 trang)

Tài liệu Slide Sap Xep docx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (309.59 KB, 65 trang )

CÁC GIảI THUậT SắP
XếP
1
1. CÁC KHÁI NIệM

Sắp xếp là quá trình xử lý một danh sách các phần tử
(hoặc các mẫu tin) để đặt chúng theo một thứ tự thỏa mãn
một tiêu chuẩn nào đó dựa trên nội dung thông tin lưu giữ
tại mỗi phần tử.

Khái niệm nghịch thế
Giả sử xét mảng có thứ tự tăng dần, nếu có i<j và a
i
>a
j
thì
ta gọi đó là nghịch thế.
Mục tiêu của sắp xếp là khử các nghịch thế (bằng cách
hoán vị)
2
a
1
a
2
a
3
a
4
… … a
N-2
a


N-1
a
N
2. CÁC GIẢI THUẬT SẮP XẾP CƠ BẢN

Đổi chổ trực tiếp – Interchange Sort

Chọn trực tiếp – Selection Sort

Chèn trực tiếp – Insertion Sort

Quick Sort

Nổi bọt – Buble Sort

Một số giải thuật khác đọc thêm trong tài liệu
3
ĐỔI CHỔ TRỰC TIẾP – INTERCHANGE SORT
Ý tưởng chính của giải thuật là xuất phát từ đầu dãy, tìm
tất cả nghịch thế chứa phần tử này, triệt tiêu chúng bằng
cách đổi chỗ phần tử này với phần tử tương ứng trong cặp
nghịch thế. Lặp lại xử lý trên với các phần tử tiếp theo
trong dãy.
4
1 2 3 4 5 6 7 8
j
i=1
5
7
3 9 2 15 1

Xét phần tử đầu tiên (vị trí 1)
10
5
1 2 3 4 5 6 7 8
j
i=2
6
7
5 9 3 15 2
Xét phần tử thứ hai (vị trí 2)
1
10
1 2 3 4 5 6 7 8
j
i=3
7
10
7 9 5 15 3
Xét phần tử thứ ba (vị trí 3)
1
2
1 2 3 4 5 6 7 8
j
i=4
8
3
10 9 7 15 5
Xét phần tử thứ tư (vị trí 4)
1
2

1 2 3 4 5 6 7 8
j
i=5
9
3
5 10 9 15 7
Xét phần tử thứ năm (vị trí 5)
1
2
1 2 3 4 5 6 7 8
j
i=6
10
3
5 7 10 15 9
Xét phần tử thứ sáu (vị trí 6)
1
2
1 2 3 4 5 6 7 8
j
i=7
11
3
5 7 9 15 10
Xét phần tử thứ bảy (vị trí 7)
1
2
1 2 3 4 5 6 7 8
i=8
12

3
5 7 9 10 15
Xét phần tử thứ tám (vị trí 8)
1
2
Dừng vì đây là
phần tử cuối cùng
của mảng
Giải thuật

Bước 1 : i = 1;// bắt đầu từ đầu dãy

Bước 2 : j = i+1;//tìm các phần tử a[j] < a[i], j>i

Bước 3 :
Trong khi j <= N thực hiện
Nếu a[j]<a[i]: Hoán vị a[i], a[j];
j = j+1;

Bước 4 : i = i+1;
Nếu i < N: Lặp lại Bước 2.
Ngược lại: Dừng.
13
Cài đặt
void InterchangeSort(int a[], int N )
{ int i, j;
for (i = 0 ; i<N-1 ; i++)
for (j =i+1; j < N ; j++)
if(a[j ]< a[i])
Hoanvi(a[i],a[j]);

}
void Hoanvi(int &a, int &b)
{
int tam=a;
a=b;
b=tam;
}
14

Ðánh giá giải thuật
Số lượng các phép so sánh xảy ra không phụ thuộc vào
tình trạng của dãy số ban đầu, nhưng số lượng phép hoán
vị thực hiện tùy thuộc vào kết qủa so sánh, có thể ước
lượng trong từng trường hợp như sau :
15
CHỌN TRỰC TIẾP – SELECTION SORT
Nếu mảng có thứ tự, phần tử a
i
luôn là min(a
i
, a
i+1
, .,
a
n-1
). Ý tưởng của thuật toán chọn trực tiếp mô phỏng
một trong những cách sắp xếp tự nhiên nhất trong thực
tế: chọn phần tử nhỏ nhất trong N phần tử ban đầu, đưa
phần tử này về vị trí đúng là đầu dãy hiện hành; sau đó
không quan tâm đến nó nữa, xem dãy hiện hành chỉ còn

N-1 phần tử của dãy ban đầu, bắt đầu từ vị trí thứ 2; lặp
lại quá trình trên cho dãy hiện hành... đến khi dãy hiện
hành chỉ còn 1 phần tử.
Dãy ban đầu có N phần tử, vậy tóm tắt ý tưởng
thuật toán là thực hiện N-1 lượt việc đưa phần tử nhỏ
nhất trong dãy hiện hành về vị trí đúng ở đầu dãy.
16
1 2 3 4 5 6 7 8
i=1
17
7
3 9 2 15 1
Tìm phần tử nhỏ nhất đầu tiên
10
5
min
1 2 3 4 5 6 7 8
i=2
18
7
3 9 2 15 10
Tìm phần tử nhỏ nhất trong dãy còn lại
1
5
min
1 2 3 4 5 6 7 8
i=3
19
7
3 9 5 15 10

Tìm phần tử nhỏ nhất trong dãy còn lại
1
2
min
min
1 2 3 4 5 6 7 8
i=4
20
3
7 9 5 15 10
Tìm phần tử nhỏ nhất trong dãy còn lại
1
2
min
1 2 3 4 5 6 7 8
i=5
21
3
5 9 7 15 10
Tìm phần tử nhỏ nhất trong dãy còn lại
1
2
min
1 2 3 4 5 6 7 8
i=6
22
3
5 7 9 15 10
Tìm phần tử nhỏ nhất trong dãy còn lại
1

2
min
1 2 3 4 5 6 7 8
i=7
23
3
5 7 9 15 10
Tìm phần tử nhỏ nhất trong dãy còn lại
1
2
1 2 3 4 5 6 7 8
i=8
24
3
5 7 9 10 15
Tìm phần tử nhỏ nhất trong dãy còn lại
1
2
Kết thúc vì chỉ còn
1 phần tử
Giải thuật
Bước 1: i = 1;
Bước 2: Tìm phần tử a[min] nhỏ nhất
trong dãy hiện hành từ a[i] đến a[N]
Bước 3: Hoán vị a[min] và a[i]
Bước 4:
i = i+1
Nếu i < N thì lặp lại Bước 2
Ngược lại: Dừng. //N phần tử đã
nằm đúng vị trí.

25

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×