Chương 3: SẮP XẾPGV.. n đối tượngCác giải thuật này thường chỉ dùng để sắp các danh sách có ít đối tượng... 3.1 Bài toán sắp xếp Tầm quan trọng của bài toán sắp xếp... 3.1 Bài toán sắp
Trang 1Chương 3: SẮP XẾP
GV Vũ Thị Thúy Vi
Trang 2n đối tượng
Các giải thuật này thường chỉ dùng để sắp các danh sách có ít đối tượng.
Trang 33.1 Bài toán sắp xếp
Tầm quan trọng của bài toán sắp xếp
Trang 43.1 Bài toán sắp xếp
Trang 53.1 Bài toán sắp xếp
Tổ chức dữ liệu và ngôn ngữ cài đặt
Trang 63.1 Bài toán sắp xếp Sắp xếp trong Sắp xếp ngoài
là sự sắp xếp dữ liệu được tổ
chức trong bộ nhớ trong của
máy tính, ở đó ta có thể sử
dụng khả năng truy nhập ngẫu
nhiên của bộ nhớ và do vậy sự
thực hiện rất nhanh
là sự sắp xếp được sử dụng khi
số lượng đối tượng cần sắp xếp lớn không thể lưu trữ trong bộ nhớ trong mà phải lưu trữ trên bộ nhớ ngoài Cụ thể là ta
sẽ sắp xếp dữ liệu được lưu trữ trong các tập tin
Trang 7INPUT: Số nguyên dương n và dãy n số
nguyên a1, a2, …, an (ai với i: 1n).
OUTPUT: Dãy n số nguyên a1, a2, …, an đã
được sắp xếp theo thứ tự tăng dần.
Xác định bài toán sắp xếp
Trang 9từ a[4] đến a[6]1 3 5 1 3 5 7 8 9 7 7 9 8 8 và hoán vị nó với phần tử a[4]
B5 chọn phần tử có khóa nhỏ nhất trong 2 phần tử từ a[5] đến a[6]
và hoán vị nó với phần tử a[5]
Trang 10Chọn phần tử có khóa nhỏ nhất trong n-i+1 phần tử
từ a[i] đến a[n] và hoán vị nó với phần tử a[i]
Bi
Sau n-1 bước này thì mảng đã được sắp xếp
Trang 12Phân tích đánh giá giải thuật sắp xếp chọn
Lệnh {6}thủ tục Swap lấy O(1) thời gian
vì chỉ thực hiện 3 lệnh gán nối tiếp nhau.
{1} FOR i := 1 TO n-1 DO BEGIN
n 1
) 2 n ( ) 1 n ( ) i n
1 n
Trang 13Bài tập
Câu 1: Hãy trình bày giải thuật sắp xếp chọn trên
dãy số nguyên A gồm 8 số nguyên sau:
Trang 143 5 9 8 1 7
Sắp xếp một dãy số nguyên A gồm 6 số nguyên sau:
B1
3.3 Sắp xếp xen Giải thuật và Ví dụ minh họa
Xem phần tử a[1] là một dãy đã có thứ tự
3
B2
Xen phần tử a[2] vào danh sách đã có thứ tự a[1] sao
cho a[1], a[2] là một danh sách có thứ tự.
5
B3
Xen phần tử a[3] vào danh sách đã có thứ tự a[1], a[2]
sao cho a[1], a[2], a[3] là một danh sách có thứ tự.
9
B4
Xen phần tử a[4] vào danh sách đã có thứ tự a[1], a[2],
a[3] sao cho a[1], a[2], a[3], a[4] là một danh sách có thứ
Trang 15Tóm tắt giải thuật sắp xếp xen
Xen phần tử a[2] vào danh sách đã có thứ tự a[1] sao
cho a[1], a[2] là một danh sách có thứ tự
B1
B2
…
Bi
Sau n-1 bước này thì mảng đã được sắp xếp
Trước hết ta xem phần tử a[1] là một dãy đã có thứ tự
Xen phần tử a[3] vào danh sách đã có thứ tự a[1], a[2]
sao cho a[1], a[2], a[3] là một danh sách có thứ tự
Xen phần tử a[i+1] vào danh sách đã có thứ tự a[1],
a[2],…,a[i] sao cho a[1], a[2], …, a[i+1] là một danh
sách có thứ tự
Trang 16{5} j:=j-1;
End;
END;
Trang 17Phân tích đánh giá giải thuật sắp xếp chọn
1} FOR i := 2 TO n DO BEGIN
{3} While(j>1)and(a[j]<a[j-1])do
Begin {4} Swap(a[j],a[j-1]);
Lệnh {3} vòng lặp chạy nhiều nhất i-1 lần,
mỗi lần tốn O(1), nên {3} lấy i-1 thời gian.
n )
1 n (
2 1 ) 1 i
n
2 i
Trang 183.4 Sắp xếp nổi bọt
1
8 5 6
3 9
Trang 19Giải thuật và Ví dụ minh họa
1 9
Sắp xếp một dãy số nguyên A gồm
6 số nguyên như hình trên
Xét các phần tử từ a[6] đến a[2], với mỗi phần tử a[j], so
sánh khoá của nó với khoá của phần tử a[j-1] đứng ngay
trước nó Nếu khoá của a[j] nhỏ hơn khoá của a[j-1] thì
hoán đổi a[j] và a[j-1] cho nhau
B1
3 8 6 5
Xét các phần tử từ a[6] đến a[3], với mỗi phần tử a[j], so
sánh khoá của nó với khoá của phần tử a[j-1] đứng ngay
trước nó Nếu khoá của a[j] nhỏ hơn khoá của a[j-1] thì
hoán đổi a[j] và a[j-1] cho nhau
B2
9
8 6 5
9 8 6 5
3 1B3
B3 Xét các phần tử từ a[6] đến a[4], với mỗi phần tử a[j], so
sánh khoá của nó với khoá của phần tử a[j-1] đứng ngay
trước nó Nếu khoá của a[j] nhỏ hơn khoá của a[j-1] thì
hoán đổi a[j] và a[j-1] cho nhau
5
B4
B4
So sánh khoá khoá của phần tử a[6] với khóa của phần
tử a[5] Nếu khoá của a[6] nhỏ hơn khoá của a[5] thì hoán
đổi a[6] và a[5] cho nhau
9 8 6
3
1
5 6
B5
B5
9 8
3
1
5 6 8
Xét các phần tử từ a[6] đến a[5], với mỗi phần tử a[j], so
sánh khoá của nó với khoá của phần tử a[j-1] đứng ngay
trước nó Nếu khoá của a[j] nhỏ hơn khoá của a[j-1] thì
hoán đổi a[j] và a[j-1] cho nhau
Sau 5 bước dãy số A đã được sắp xếp đúng thứ tự
Trang 20Tóm tắt giải thuật sắp xếp chọn
Xét các phần tử từ a[n] đến a[2] , với mỗi phần tử
a[j], so sánh khoá của nó với khoá của phần tử a[j-1]
đứng ngay trước nó Nếu khoá của a[j] nhỏ hơn
khoá của a[j-1] thì hoán đổi a[j] và a[j-1] cho nhau
B1
B2
…
Sau n-1 bước này thì mảng đã được sắp xếp
Xét các phần tử từ a[n] đến a[3] , và làm tương tự
như trên.
Trang 21{2} FOR j := n DOWNTO i+1 DO
{3} IF a[j] <a[j-1] THEN
{4} Swap(a[j],a[j-1]);
END;
Trang 22Phân tích đánh giá giải thuật sắp xếp nổi bọt
{1} FOR i := 1 TO n-1 DO {2} FOR j:=n DOWNTO i+1 DO {3} IF a[j]<a[j-1] DO {4} Swap(a[j],a[j-1]);
) 2 n ( ) 1 n ( ) i n
1 n
1 i
Trang 233.5 Quicksort
2
3 3 3 3 3
3
Lưu ý: Một mảng chỉ gồm một phần tử hoặc gồm
nhiều phần tử có khóa bằng nhau thì đã có thứ tự
Giải thuật và Ví dụ minh họa Sắp xếp một dãy số nguyên A gồm 8 số nguyên sau:
Ta có L > R nên ta đã xác định được điểm
phân họach ứng với L=4.
3 4 1 8 9 5 6 7
Trang 24 Mảng đã cho được phân thành 2 mảng con
3 4 1 8 9 5 6 7
v=4 v=4
Trang 25Tóm tắt giải thuật Quicksort
Ðể sắp xếp mảng a[i] a[n] ta tiến hành các bước sau: B1
Trang 26Chương trình
Type Mang=Array[1 100] of Integer;
Function chot(a: Mang; i, n: Integer): Integer;
Var k, phantudau,chisochot: Integer;
Begin {1} k:=i+1;
{2} phantudau:=a[i];
{3} while(k<=n)and(a[k]=phantudau) do {4} k:=k+1;
{5} if(k>n) then {6} chisochot:=0;
else {7} if(a[k]>phantudau) then {8} chisochot:=k;
Trang 27FUNCTION Phanhoach(a: Mang; i,n,chot:integer): integer;
VAR L,R, tam : integer;
BEGIN
{1} L := i; {Ðặt con nháy L ở cực trái}
{2} R := n; {Ðặt con nháy R ở cực phải}
{3} WHILE L <= r DO
BEGIN
{L tiến sang phải}
{4} WHILE a[L] < chot DO L := L+1;
{R tiến sang trái}
{5} WHILE a[R]>= chot DO R := R-1;
Trang 28PROCEDURE Quicksort(a: Mang; i,n:integer);
VAR chot, vitrichot, k : integer;
BEGIN
vitrichot:= chot(a,i,n);
IF vitrichot <> 0 THEN begin
Chương trình Phân tích đánh giá giải thuật
Quicksort lấy O(nlogn) thời gian để sắp xếp n phần tử trong