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

Chương 3: KỸ THUẬT SẮP XẾP pptx

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 (272.21 KB, 21 trang )

1
Môn: CẤU TRÚC DỮ LIỆU
Chương 3: KỸ THUẬT SẮP XẾP
2
NỘI DUNG CHƯƠNG 3
1. Khái quát về sắp xếp
2. Các phương pháp sắp xếp (Sắp xếp trên dãy)

Sắp xếp bằng phương pháp chọn trực tiếp (Selection)

Sắp xếp bằng phương pháp chèn trực tiếp (Insertion)

Sắp xếp bằng phương pháp đổi chỗ trực tiếp
(Exchange)

Sắp xếp bằng phương pháp trộn (Merge)
3. Các phương pháp sắp xếp (Sắp xếp trên tập tin)

Sắp xếp tập tin bằng phương pháp trộn

Sắp xếp tập tin theo chỉ mục
BÀI TẬP
3
1. Khái quát về sắp xếp
Sắp xếp là thao tác cần thiết thường được thực hiện trong quá
trình lưu trữ và quản lý dữ liệu.
Thứ tự dữ liệu có thể tăng hay giảm, tăng hay giảm thuật toán
sắp xếp là tương tự.
Hai nhóm giải thuật sắp xếp

Các giải thuật sắp xếp thứ tự nội (sx thứ tự trên mảng)



Các giải thuật sắp xếp thứ tự ngoại (sx thứ tự trên tập tin)
Xem như mỗi phần tử dữ liệu được xem xét có một thành
phần khóa (Key) để nhận diện có kiểu dữ liệu T, các thành
phần còn lại là thông tin (Info), như vậy mỗi phần tử có
cấu trúc như sau:
typedef struct DataElement
{
T Key;
InfoData Info;
} DataType;
Để đơn giản, quan tâm thành phần dữ liệu chỉ là khóa nhận
diện
4
2. Sắp xếp trên dãy/mảng (tt)
2.1. Sắp xếp bằng phương pháp chọn trực tiếp (Selection
Sort)

Dãy a có N phần tử chưa có thứ tự. Chọn phần tử nhỏ
nhất của dãy này đưa lên đầu dãy.

Sau lần chọn thứ nhất, còn lại N-1 phần tử chưa có thứ
tự. Tiếp tục thực hiện, sau N-1 lần lựa chọn và đưa phần
tử nhỏ nhất lên trên

dãy a có thứ tự tăng dần.

Để tìm phần tử nhỏ nhất của dãy dựa vào cách tìm kiếm
duyệt dãy tuần tự.
5

2. Sắp xếp trên dãy/mảng (tt)
2.1. (tt) Selection Sort: Thuật toán
B1: i=1
B2: Tìm phần tử nhỏ nhất a[min] trong dãy từ a[i] đến a[n]
B3: Hoán vị a[min] với a[i]
B4: Nếu i<n thì i=i+1. lặp lại B2
Ngược lại: Dừng
6
2. Sắp xếp trên dãy/mảng (tt)
2.1. (tt) Straight Selection Sort: Cài đặt thuật toán
void SelectionSort(int a[], int n)
{ int i,j,min;
for(i=0; i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++)
if(a[j]<a[min])
min=j;
hoanvi(a[min],a[i])
}
}
7
2. Sắp xếp trên dãy/mảng (tt)
2.1. (tt) Straight Selection Sort: Cài đặt thuật toán
void hoanvi(int &a, int &b)
{
int temp;
temp=a;
a=b;
b=temp;

}
8
2. Sắp xếp trên dãy/mảng (tt)
2.1. (tt) Chọn trực tiếp (Straight Selection Sort)
Phân tích thuật toán:

Trong mọi trường hợp

Số phép so sánh S = (N-1) + (N-2) +… + 1 = ½N(N-1)

Số phép hoán vị H = N-1

Trong trường hợp tốt nhất

Số phép gán G
min

= 2 x (N-1)

Trong trường hợp xấu nhất

Số phép gán G
max

= 2 x [(N-1) + (N-2) +… + 1]

Trong trường hợp trung bình

Số phép gán G
avg


= (G
min
+G
max
)/2
9
2. Sắp xếp trên dãy/mảng (tt)
2.2. Sắp xếp bằng phương pháp chèn trực tiếp (Insertion
Sort)
a. thuật toán:
Giả sử ta có dãy a1,a2,…,a
n
trong đó i phần tử đầu tiên a1,a2,
…,a
i-1
đã có thứ tự. Ý tưởng của giải thuật là tìm cách
chèn phần tử a
i
vào vị trí thích hợp của đoạn đã sắp xếp
để có dãy a1,a2,…,a
i
có thứ tự.
Cho dãy a1,a2,…, a
n
. Ta có thể xem như đã có đoạn gồm một
phần tử a1 đã sắp xếp. Sau đó ta thêm a2 vào đoạn a1, sẽ
có đoạn a1,a2 sắp xếp. Tương tự thêm a3 vào a1, a2…
tiếp tục cho đến khi thêm a
n

vào a1,a2,…,a
n-1.
Các bước
tiến hành như sau:
10
2. Sắp xếp trên dãy/mảng (tt)
B1: i=2; //giả sử a[1] đã được sắp
B2: 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
B3: Dời chổ các phần tử từ a[pos] đến a[i-1] sang phải một vị
trí để dành chổ cho a[i]
B4: a[pos]=x; //có đoạn a[1],…,a[i] đã được sắp
B5: i=i+1
Nếu i<=n. lặp lại B2
Ngược lại: dừng
11
2. Sắp xếp trên dãy/mảng (tt)
b. Ví dụ minh hoạ: vd-t50
c. Cài đặt:
Void intersectionsort( int a[], int n)
{
int i,pos;
int x;
for(i=1;i<n;i++) //a[0] đã sắp
{
x=a[i]; pos=i-1;
// tìm vị trí
while((pos>=0)&&(a[pos]>x))
{

a[pos+1]=a[pos]; //dời sang phải
pos ;
}
a[pos+1]=x; // chèn x vào dãy
}
}
12
2. Sắp xếp trên dãy/mảng (tt)
2.3. Chèn trực tiếp (Straight Insertion Sort) (tt)
Phân tích thuật toán

Trong trường hợp tốt nhất

Số phép gán G
min

= 2 × (N-1)

Số phép so sánh S
min
= 1 + 2 + … +(N-1) = N ×(N-1)/2

Số phép hoán vị H
min
= 0

Trong trường hợp xấu nhất

Số phép gán G
max


= [2 × (N-1)] + [1+2+…+(N-1)]

Số phép so sánh S
max
= (N-1)

Số phép hoán vị H
max
= 0

Trong trường hợp trung bình

Số phép gán G
avg

= (G
min
+G
max
)/2
Quá trình tìm vị trí chèn của phần tử thứ K+1 và quá trình dời
13
2. Sắp xếp trên dãy/mảng (tt)
2.3. Phương pháp đổi chỗ trực tiếp:
a. Ý tưởng:
Xuất phát từ đầu dãy, tìm tất cả các phần tử nhỏ hơn phần tử
này, đổi chổ các phần tử tương ứng. Lặp lại xử lý trên với
các phần tử tiếp theo trong dãy
14

2. Sắp xếp trên dãy/mảng (tt)
2.3. Phương pháp đổi chỗ trực tiếp:
b. Thuật toán:
B1: i=1; //bắt đầu từ đầu dãy
B2: j=i+1; //tìm các phần tử a[j]<a[i], j>i
B3:
Trong khi j<=n thực hiện
nếu a[j]<a[i]: hoán vị(a[j], a[i]);
j=j+1;
B4: i=i+1;
Nếu i<n: lặp lại B2
Ngược lại: dừng
15
2. Sắp xếp trên dãy/mảng (tt)
2.3. Phương pháp đổi chỗ trực tiếp:
c. Ví dụ minh hoạ:
d. 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]) //nếu có sự sai vị trí thì đổi chổ
hoanvi(a[i], a[j]);
}
16
2. Sắp xếp trên dãy/mảng
2.4. a. Thuật toán sắp xếp nổi bọt (Bubble Sort)
Ý tưởng:


Đi từ cuối mảng đến đầu mảng, nếu phần tử ở dưới <
phần tử đứng trên nó thì sẽ được “đưa lên trên”.

Sau mỗi lần đi duyệt dãy, 1 phần tử sẽ được đưa lên đúng
chỗ của nó. Đối với mảng M có N phần tử thì sau N-1 lần
đi duyệt dãy

dãy M có thứ tự tăng.
17
2. Sắp xếp trên dãy/mảng (tt)
2.4. a. Bubble Sort (tt) Thuật toán:
B1: i = 1; // lần xử lý đầu tiên
B2: j=n; //duyệt từ cuối dãy về I
Trong khi i<j thì thực hiện
Nếu a[j]<a[j-1] thì hoán vị(a[j],a[j-1])
j=j-1;
B3:i=i+1;
Nếu i>n-1 thì dừng; // đã xét hết dãy số
Ngược lại: Lặp lại B2
18
2. Sắp xếp trên dãy/mảng (tt)
2.4. a. Bubble Sort (tt) Cài đặt thuật toán:
void Swap(int &X, int &Y)
{ int Temp = X;
X = Y;
Y = Temp;
}
void BubbleSort(int a[], int n)
{ for(int i =0; i<N-1; i++)
for(int j=n-1; j>i; j )

if (a[j] < a[j-1])
Swap(a[j], a[j-1]);
}
19
2. Sắp xếp trên dãy/mảng (tt)
2.4. a. Bubble Sort (tt) Phân tích thuật toán:

Trong mọi trường hợp

Số phép gán G = 0

Số phép so sánh S = (N-1) + (N-2) +… + 1 = ½N(N-1)

Trong trường hợp tốt nhất

Số phép hoán vị các phần tử H
min

= 0

Trong trường hợp xấu nhất

Số phép hoán vị các phần tử H
max

= (N-1) + (N-2) +… + 1
20
2. Sắp xếp trên dãy/mảng (tt)
2.4. a. Bubble Sort (tt) Nhận xét thuật toán:


Thuật toán đơn giản dễ cài đặt

Vói Bubble Sort, phần tử “nhỏ” ở dưới được đưa lên rất
nhanh nhưng phần tử “lớn” lại đi xuống chậm, không tận
dụng được chiều ngược lại

Thuật toán không nhận diện được các phần tử ở 2 đầu
của mảng đã nằm đúng vị trí để giảm bớt quãng đường
trong mỗi lần duyệt.
21
BÀI TẬP

Bài tập chương 3 (trang 84 - 85)

(Lý thuyết) Cho một mảng số nguyên bao gồm 20 phần tử
như sau 23 34 46 16 8 9 7 6 13 22 65 45 18
29 45 15 3 10 84 21
Tính số phép gán, số lần so sánh, hoán vị của mỗi thuật
toán (Bubble Sort, QuickSort, Straight Selection Sort,
Straight Insertion Sort , Straight Merge Sort, Natural
Merge Sort) là bao nhiêu?

(Lý thuyết) Nếu đối với dãy có giá trị phần tử giữa dãy lớn
nhất, áp dụng phương pháp nào nhanh hơn QuickSort
hay Bubble Sort?
(VD: dãy : 23 4 6 77 45 5 6 7)

Cài đặt các giải thuật sắp xếp trong lý thuyết đối với các
dãy | mảng có giá trị giảm dần

×