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

BÁO CÁO SẮP XẾP THỨ TỰ TRÊN DANH SÁCH LIÊN KẾT

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 (3.15 MB, 68 trang )



1. Nguyeãn Thò Hoàng Nhi
1. Nguyeãn Thò Hoàng Nhi
MSSV:K30-101-066
2. Traàn Minh Phöông
2. Traàn Minh Phöông
MSSV:K30-101-074
MSSV:K30-101-074
LP:3/B

SẮP XẾP THỨ TỰ TRÊN
SẮP XẾP THỨ TỰ TRÊN
DANH SÁCH LIÊN KẾT
DANH SÁCH LIÊN KẾT


Một danh sách có thứ tự (danh sách được sắp) là một danh sách
Một danh sách có thứ tự (danh sách được sắp) là một danh sách
mà các phần tử của nó được sắp xếp theo một thứ tự nào đó dựa
mà các phần tử của nó được sắp xếp theo một thứ tự nào đó dựa
trên một trường khoá.
trên một trường khoá.



Ví dụ
Ví dụ
:
:



Danh sách các phần tử số có thứ tự tăng là danh sách mà với mọi
Danh sách các phần tử số có thứ tự tăng là danh sách mà với mọi
cặp phần tử X, Y ta luôn có X < = Y nếu X xuất hiện trước Y trong
cặp phần tử X, Y ta luôn có X < = Y nếu X xuất hiện trước Y trong
danh sách.
danh sách.



Chú ý
Chú ý
: danh sách có 1 hoặc không có phần tử nào được xem là
: danh sách có 1 hoặc không có phần tử nào được xem là
một danh sách được sắp.
một danh sách được sắp.


SẮP XẾP THỨ TỰ TRÊN
SẮP XẾP THỨ TỰ TRÊN
DANH SÁCH LIÊN KẾT
DANH SÁCH LIÊN KẾT
Các cách tiếp cận:


Phương án 1 (thao tác trên vùng Info) : Hoán vò nội dung
các phần tử trong danh sách.


Phương án 2 (thao tác trên vùng Next) : Thay đổi các mối

liên kết


SẮP XẾP THỨ TỰ TRÊN
SẮP XẾP THỨ TỰ TRÊN
DANH SÁCH LIÊN KẾT
DANH SÁCH LIÊN KẾT
Phương án 1 :

Cài đặt lại trên xâu một trong những thuật toán sắp xếp đã biết
trên mảng.

Điểm khác biệt duy nhất là cách thức truy xuất đến các phần tử
trên xâu thông qua liên kết thay vì chỉ số như trên mảng.

Do thực hiện hoán vò nội dung của các phần tử nên đòi hỏi sử dụng
thêm vùng nhớ trung gian

chỉ thích hợp với các xâu có các phần
tử có thành phần Info kích thước nhỏ.

Khi kích thước của trường Info lớn, việc hoán vò giá trò của hai
phân tử sẽ chiếm chi phí đáng kể.

Không tận dụng được các ưu điểm của xâu!




THUẬT TOÁN CHỌN

THUẬT TOÁN CHỌN
TRỰC TIẾP TRÊN XÂU
TRỰC TIẾP TRÊN XÂU


THAO TAÙC TREÂN VUØNG INFO
THAO TAÙC TREÂN VUØNG INFO
void ListSelectionSort (LIST &l)
{
NODE *min;
NODE *p, *q;
p = l.pHead;
while ( p != pTail )
{
q = p

pNext;
min = p;
while ( q != NULL )
{
if ( q

Info < min

Info )
min = q;
q = q

pNext;
}

Hoanvi ( min

Info, p

Info);
p = p

pNext;
}
}


THAO TÁC TRÊN VÙNG NEXT
THAO TÁC TRÊN VÙNG NEXT
Phương án 2:

Do các nhược điểm của các phương pháp sắp xếp theo phương án
1, khi dữ liệu lưu tại mỗi phần tử trên xâu có kích thước lớn ta
thường dùng một cách tiếp cận khác :
+ Thay vì hoán đổi giá trò, ta sẽ tìm cách thay đổi trình tự móc
nối của các phần tử sao cho tạo lập nên được thứ tự mong muốn

chỉ thao tác trên các móc nối (pNext).
+ Kích thước của trường pNext:

Không phụ thuộc vào bản chất dữ liệu lưu trong xâu

Bằng kích thước 1 con trỏ (2 hoặc 4 byte trong môi trường 16
bit, 4 hoặc 8 byte trong môi trường 32 bit…)
+ Thao tác trên các móc nối thường phức tạp hơn thao tác trực

tiếp trên dữ liệu.

Cần cân nhắc khi chọn cách tiếp cận: Nếu d liệu không quá lớn ữ
thì nên chọn phương án 1 hoặc một thuật toán hiệu quả nào đó.


THAO TÁC TRÊN VÙNG NEXT
THAO TÁC TRÊN VÙNG NEXT

Một trong những cách thay đổi móc nối đơn giản nhất là tạo một danh sách
mới là danh sách có thứ tự gồm các phần tử trích từ danh sách cũ.
Giả sử danh sách mới sẽ được quản lý bằng con trỏ đầu xâu Result, ta có thuật
toán chọn trực tiếp c a phương án 2 như sau:ủ

B1: Khởi tạo danh sách mới Result là rỗng;

B2: Tìm trong danh sách cũ l phần tử nhỏ nhất – min;

B3: Tách min khỏi danh sách cũ;

B4: Chèn min vào cuối danh sách Result;

B5: Lặp lại bước 2 khi chưa hết danh sách cũ;


THAO TAC TREN VUỉNG NEXT
THAO TAC TREN VUỉNG NEXT
Vớ duù :
3 9 7 16
pHead 1

pTail 1
pHead2
pTail2
min
13
pTail2


THAO TAÙC TREÂN VUØNG NEXT
THAO TAÙC TREÂN VUØNG NEXT
13 9 7 16
pHead 1
pTail 1
pHead2
pTail2
3
min
pTail2


THAO TAÙC TREÂN VUØNG NEXT
THAO TAÙC TREÂN VUØNG NEXT
9 16
pHead 1
pTail 1
pHead2
pTail2
3
min
7

13
pTail2


THAO TAÙC TREÂN VUØNG NEXT
THAO TAÙC TREÂN VUØNG NEXT
pTail 1
pHead2
pTail2
3 7
min
9
pTail2
16
pHead 1
13


THAO TAÙC TREÂN VUØNG NEXT
THAO TAÙC TREÂN VUØNG NEXT
16
pHead 1
pTail 1
pHead2
pTail2
3 7 9 13
min
pTail2
pTail 1



THAO TAÙC TREÂN VUØNG NEXT
THAO TAÙC TREÂN VUØNG NEXT
pHead 1
pTail 1
pHead2
pTail2
3 7 9 13 16


THAO TÁC TRÊN VÙNG NEXT
THAO TÁC TRÊN VÙNG NEXT
NODE * FindMinprev (LIST &l1) // Tìm phần tử đứng trước min trong danh sách
{
NODE *min ; // chỉ đến phần tử có giá trò nhỏ nhất trong xâu
NODE *p, *q, *minprev;
p = l1.pHead;
q = p

pNext;
min = p;
minprev = NULL;
while (q != NULL)
{
if (q

Info < min

Info)
{

min = q;
minprev = p;//chỉ phần tử đứng trước min trong xâu
}
p = q;
q = q

pNext;
}
return minprev;
}


THAO TÁC TRÊN VÙNG NEXT
THAO TÁC TRÊN VÙNG NEXT
void ListSelectionSort2 (LIST &l1)
{
LIST lRes;
NODE *min, *minprev;
init ( lRes ); // khởi tạo danh sách mới
while(l1.pHead != NULL)
{
minprev = FindMinprev(l1);
min = PickAfter(l1, minprev);// Lấy phần tử min
AddTail(lRes, min);// Chèn min vào cuối danh sách l2
}
l1 = lRes;
}


THUAÄT TOAÙN

THUAÄT TOAÙN
QUICK SORT
QUICK SORT


THUẬT TOÁN QUICK SORT
THUẬT TOÁN QUICK SORT
Bước 1:
Bước 1:
Nếu DS có ít hơn 2 phần tử thì dừng.
Nếu DS có ít hơn 2 phần tử thì dừng.
Bước 2:
Bước 2:
Chọn X là phần tử đầu danh sách làm phần
Chọn X là phần tử đầu danh sách làm phần
tử cầm canh. Loại X ra khỏi danh sách
tử cầm canh. Loại X ra khỏi danh sách.
Bước 3:
Bước 3:
Tách DS ra làm DS1 (gồm phần tử X) và
Tách DS ra làm DS1 (gồm phần tử X) và
DS2 (gồm các phần tử >X).
DS2 (gồm các phần tử >X).
Bước 4:
Bước 4:
Nếu DS1!=NULL thì Quick sort (DS1).
Nếu DS1!=NULL thì Quick sort (DS1).
Bước 5:
Bước 5:
Nếu DS2!=NULL thì Quick sort (DS2)

Nếu DS2!=NULL thì Quick sort (DS2)
.
.
Bước 6:
Bước 6:
Nối DS1 – X – DS2 ta có DS đã được sắp
Nối DS1 – X – DS2 ta có DS đã được sắp
xếp.
xếp.



V DU
Sắp xếp dãy số sau theo thứ tự tăng dần:
Sắp xếp dãy số sau theo thứ tự tăng dần:
3 5 4 1 9 2
3 5 4 1 9 2
pHead
pHead
3
2
9
4
1
5
V DU
Sắp xếp dãy số sau theo thứ tự tăng dần:
3 5 4 1 9 2
pHead
pHead

3
pTail
pTail


pHead
pHead
Choùn phan tửỷ ủau tieõn laứm phan tửỷ cam canh
Choùn phan tửỷ ủau tieõn laứm phan tửỷ cam canh
X
X
2
9
4
1
5
3


pHead
pHead
X
X
2
9
4
1
5
3
ds1

ds1
ds2
ds2
Taùch danh saùch hieän haønh thaønh 2 ds
Taùch danh saùch hieän haønh thaønh 2 ds


pHead
pHead
X
X
2
9
4
1
5
3
ds1
ds1
ds2
ds2
Taùch danh saùch hieän haønh thaønh 2 ds
Taùch danh saùch hieän haønh thaønh 2 ds


pHead
pHead
X
X
2

9
4
1
5
3
ds1
ds1
ds2
ds2
Taùch danh saùch hieän haønh thaønh 2 ds
Taùch danh saùch hieän haønh thaønh 2 ds


pHead
pHead
X
X
2
9
4
1
5
3
ds1
ds1
ds2
ds2
Taùch danh saùch hieän haønh thaønh 2 ds
Taùch danh saùch hieän haønh thaønh 2 ds

×