Giáo trình Cấu trúc dữ liệu và giải thuật (Nghề Tin học ứng dụng - Trình độ Cao đẳng) gồm có những nội dung chính sau: Chương 1: giải thuật; chương 2: cấu trúc mảng; chương 3: danh sách; chương 4: ngăn xếp (stack) và hàng đợi (queue); chương 5: cấu trúc cây(tree); chương 6: đồ thị (graph).
Trang 1BỘ GIAO THÔNG VẬN TẢI TRUONG CAO DANG GIAO THONG VAN TAI TRUNG ƯƠNG Ï
Ban hanh theo Quyét dinh s6 498/QD-CDGTVTTWI-DT ngay 25/03/2019
của Hiệu trưởng Trường Cao đẳng GTVT Trung ương I
Trang 3TUYEN BO BAN QUYEN
Tài liệu này thuộc loại sách giáo trình nên các nguồn thông tin có thể được phép dùng nguyên bản hoặc trích dẫn dùng cho các mục đích về đào tạo và tham khảo
Mọi mục đích khác mang tính lệch lạc hoặc sử dụng với mục đích kinh doanh thiếu
lành mạnh sẽ bị nghiêm cắm
Mã tài liệu: THUD - MH15
Trang 4LỜI NÓI ĐẦU
Giáo trình này là một trong những giáo trình chính yếu của ngành Tin học ứng dụng Giáo trình được xây dựng theo phương châm vừa đáp ứng yêu cầu chuẩn mực của sách giáo khoa, vừa có giá trị thực tiễn, đồng thời tăng cường khả năng tự học, tự nghiên cứu của sinh viên Trên cơ sở đó, chúng tôi đã nghiên cứu & tham khảo nhiều tài liệu có giá trị của các tác giả trong và ngoài nước
Giáo trình được dùng làm tài liệu học tập cho sinh viên ngành Tin học ứng dụng Trình độ Cao đẳng — Trường Cao đẳng GTVT Trung ương I
Va lam tai liệu tham khảo nội bộ cho Giáo viên
Trong quá trình biên soạn, sẽ không thể tránh khỏi những thiếu sót Chúng tôi rất
mong nhận được các ý kiến đóng góp đề giáo trình ngày càng hoàn thiện hơn
Xin chân thành cảm ơn!
NHÓM BIÊN SOẠN
Trang 5
SA, Din Ng ay .500-.ss0cressseresnrornsenonensnonsnsevesesoncnensuestenvaesenssswnnns ri CEnE1001800000100001100800070900100 26
3.2 Lưu trữ kế tiếm đối với danh sách +++++©+++vettEEEkkrritttkrrrirrrrrrrriiriee 26 3.3 Lưu trữ móc nối đối với danh sách +++++V+++++tEEEkLiEtE EE re 26
3.3.1 Giới thiệu phương pháp
3.3.2 Một số phép toán trên ds móc nối + ©+2++2E22+v221111222112111112 11, e 29 3.3.3 Một số dạng khách trong ds móc nối -¿ -+°2©©++++t#SEEYvvettErkrrrrrrkkkrree 32
Trang 6CHƯƠNG 4: NGĂN XẾP (Stack) VÀ HÀNG ĐỢI (Queue) 2+-©©222+++2EE2++teettE2222errrrrtrrree 33 4.1 Định nghĩa Stack:
AQ LHŒKKẾHÊDVDTSEEGuetitdsutdtiotSiSNOOGOYGDGNOSHONSEOOSHANGGUGSdpHiuSRQiSMS 33 A.D Ap GUNG CHO SEIC Go cnunpgo hũ gu GA gà HH5 1441:461508ãE014813881881305414886184810513x846384083ã1338001848188 318501648008 35 4.3.1 Bài toán đổi cơ số từ thập phân sang nhị phân -+22++2++vvSE.11 10 re, 35 4.3.2 Biểu thức số học Ba-lan
s.1)0c1-089/( 08/0/17) (0) 6 39 5.1 Dinh ñehia và tiộE số kHái HIẾN ngà dt ga gãã60tiöigS0ãxãS014301840516661:53101.518164256100138011a s04 39
5.2 Cây HRị BHÂNTE:c¡ccccccc0ncgiinbicc G5 g101ö 4ù: GiảyG4gãga635344g611845455130402383gGz41008:33g3G384gx1i4-1040140461G14S11 101 á đã 41
5S DA SOTA aces ssvucceovccaanovenzessccerssskessvassussssuesensaseanscensvsateassusensosdneasswconsencavanscsncasabeanesessenasens 41
6.2.1 Biểu diễn bằng ma trận lân cận .- 2: ©++9SVS2t9EEE12E211122211122111171112111121112 211 xe 55
6.2.2 Biểu diễn ma trận bằng danh sách lân cân .¿ + ©++©+++EE++++EEvxttEExvrrrrrrrrtrrrr 56
6:3: Áb dUNẾ :eecbcggsggggidồngGiigHiiitttqGqGGIGRNHERiS0GGGĂRiSNiGiARisoiữạuligdaqsaugat 57
6,8/1.Bấi triển ti'đỮH ỔĨ sa nananonairiioi tạng hứng Hộ tanHR601510088.118/8181010a30/14L481813300u646101.48.814 8808 57
Trang 7CHƯƠNG 1: GIẢI THUẬT
Giới thiệu về môn học:
Cấu trúc dữ liệu và giải thuật là một trong những môn học cơ bản của sinh viên
nghành CNTT khi muốn tiếp cận với lập trình và xây dựng phần mềm Cấu trúc dữ liệu và các giải thuật được xem như là yếu tố quan trọng nhất trong lập trình Chương trình phần mềm = Cấu trúc + Giải thuật
Cấu trúc đữ liệu có thể được xem như là một phương pháp lưu trữ đữ liệu trong
máy tính nhằm sử dụng một cách có hiệu quả những dữ liệu này Và để sử dụng các dữ liệu một cách hiệu quả thì cần có các thuật toán áp dụng trên các dữ liệu đó
Do vậy Cấu trúc dữ liệu và giải thuật là 2 yếu tố không thể tách rời và có những liên quan chặt chẽ với nhau
1.1 Cấu trúc dữ liệu và giải thuật
- _ Giải thuật (Thuật toán): Giải thuật là một tập hữu hạn các phép toán cơ sở
được sắp đặt theo quy tắc chính xác, nhằm giải một bài toán
- _ Các phép toán cơ sở là các phép toán đơn giản mà thời gian thực hiện nó
luôn là một hằng số, nghĩa là nó không phụ thuộc vào kích thước của toán
hạng
- _ Các phép toán trong giải thuật luôn được xác định rõ ràng , không mập mo,
ai cũng có thể hiểu được cách thực hiện của nó
-_ Chú ý: Giải thuật có thể thay đồi khi cấu trúc đữ liệu thay đổi
1.2 Ngôn ngữ diễn giả:
- Nếu sử dụng đến một ngôn ngữ lập trình cấp cao nào đó chẳng hạn như Pascal, C Như vậy sẽ gặp một số hạn chế sau:
+ Phải luôn tuân thủ cú pháp chặt chẽ của ngôn ngữ đó, khiến cho việc trình
bày giải thật và cầu trúc dữ liệu có thiên hướng nặng nề, gò bó
+ Phải phụ thuộc vào cấu trúc dữ liệu tiền định (Mỗi một ngôn ngữ dữ liệu
dé ấn định sẵn những cấu trúc dữ liệu cho riêng mình)của ngôn ngữ lên
không thé hiện được dầy đủ các ý của từng giải thuật
+ Ngôn ngữ đã chọn không phải ai cũng ưa thích và sử dụng
-_ Như vậy ở đây ta sẽ dùng ngôn ngữ thô hơn có đủ khả năng diễn đặt đc giải thuật ta tạm gọi bằng các tên ngôn ngữ tựa Pascal.Các quy tác bắt đầu
Trang 81.2.1
1.2.3
Quy tác về cấu trúc chương trình:
Mỗi chương trình đều được ngắn một tên để phân biệt, tên này được viết
bằng chữ in hoa, có thể thêm dấu gạch nói va bắt đầu bằng từ khóa
Program
VD: Program TEN_CHUONG_TRINH
Độ dài tên không bị bạn chế
Sau tên có thể kèm theo lời thuyết minh (Ở đây ta quy ước dùng tiếng việt)
Phần thuyết minh được đặt giữa 2 đấu ‡ }
Ký tự và biểu thức
._ Ký tự dùng ở đây giống như các ngôn ngữ chuẩn
26 chữ cái Latinh in hoa hoặc in thường
10 chữ số thập phân
Các dấu phép toán số học +, -, %, /, † (Lñy thừa)
Các dấu phép toán quan hé: <, >, =, <>, #
Gia tri logic: True, false
Dấu phép toán logic: and, or, not
Tên biến: Dãy chữ cái và chữ số, bắt đầu bằng chữ cái
Biến chỉ số có hạng: A[ï], B[i,j] vv
Còn biểu thức, cũng như thứ tự ưu tiên cũng giống như các ngôn ngữ lập trình khác (Cộng trừ trước nhân chia sau .)
Trang 9Si © 1, „n là các câu lệnh
Nó chõ phép nghép nhiều câu lệnh lại để thành một câu lệnh
Câu lệnh điền kiện
By: Sp;
Else : Sasi
End case
V6i B; (i=1,2 n) 1a cdc diéu kién
S¡ŒE I n): là các câu lệnh
Trang 10Câu lệnh này cho phép phân biệt các tình huống xử lý khác nhau trong các điều kiện khác nhau mà không cần dùng đến câu lệnh if
lồng nhau Có thé điễn tả bởi sơ đồ
false false false
Nhằm thực hiện câu lệnh S với ¡ lat giá trị nguyên từ m tới n (n>=m) với
bước nhay tang =1
Hoac :
For i:=n down to m do S
Tương tự như câu lệnh trên với bước nhay giảm 1
b Với số lần lặp không biết trước
Trang 11
Chừng nào B có giá trị true thì thực hiện S
Hoặc;
Repeat S until B Lặp S cho tới khi B có giá trị đúng (S có thể là một dãy lệnh)
Read ( <Danh sách biến>)
'Write(<Danh sách biến hoặc dòng ký tự>)
Các biến trong danh sách cách nhau bởi dấu phẩy
Dòng ký tự là một dãy các ký tự đặt giữa 2 dấu °’
Trang 12Từùkhóa oe u_ thay cho function
Trong cấu tạo của chương trình con hàm bao giờ cũng có câu lệnh gan
mà tên hàm nằm ở về trái Còn đối với tên hàm con thủ tục thì không có
Lời gọi chương trình con hàm thể hiện bằng tên hàm
Lời gọi của chương trình con thủ tục thể hiện bằng câu lệnh call có dạng:
Call<Tên thủ tục>(<Danh sách tham số thực>)
1.3 Thiết kế giải thuật
- _ Thiết kể kiểu top-down (Cách thiết kế đi từ tổng thể đến chỉ tiết - Chia để
tr)
Là tách bài toán ra thành các bài ra thành các bài toán con mỗi bài toán con
này lại áp dụng một chiến thuật tương tự (Chia nhỏ dần) cho tới khi tới
những bài toán con đủ nhỏ để có thể giải trực tiếp được Sau đó chỉ cần tổng
hợp lại các phéo xử lý để có giải thuật của bài toán gốc
a Cách làm:
- _ Xác định được dõ dữ liệu yêu cầu: Cho biết cái gi (Input) va doi hdi cai gi(out put)
- Dé giải quyết được yêu cầu thì phải làm gi
-_ Với mỗi công việc ấy thì phải làm thé nao?
VD: Ta xét bài toán sau : Sắp xếp dãy số (an, a2, ,a,) Thành dãy số tăng
¢ Décé de két qua output nhw vậy thì phải làm gì?
Có thể thấy rang sắp xếp theo kiểu tăng dần nghĩa là:
+ Số bé nhất trong N số phải được đặt ở vị trí đầu tiên
+ Số bé nhất trong (N-1) số còn lại phải đc đặt vào vị trị thứ 2
T+ VV
Như vậy có 2 công việc chính phải làm:
+ Chọn số bé nhất trong dãy số chưa được sắp xếp
Trang 13
+ Đặt nó vào vị trí sau phần tử cuối của dãy số đã được sắp xếp
Chú ý: Lúc đầu dãy số còn rỗng, sau đó nó được bổ xung dần dần các phần
1 2 công việc được lặp lại n-l lần
For i:=1 to (n-1) do begin
2 Chọn số nhỏ nhất A[k] trong dãy các số
Afi], Afit1], A[n]
3 Hoán vị giữa A[k] và A[i]
4 Reture
5 End;
Bây giời ta đi sâu vào từng công việc
+ Chọn số nhỏ nhất trong dãy số: A[ï], A[†+1] , A[n]
K=I ;{Coi phần tử đầu là nhỏ nhất lúc đó, và giữ lại chỉ số của nó}
For J:= i+l to n do
If A[j]<A[k] then k:=j;
+ Hoán đổi cị trí cho nhau:
Hoán đổi giữa 2 vị trí A[k] và A[ï]
LOC :=A[K]; A[KIEA[T]; A[I]:=LOC;
Tổng hợp những ghi nhận ở trên ta đi tới một thủ tục thể hiện giải thuật sắp xếp,
bằng ngôn ngữ tựa pascal như sau:
Procedure Selection_sort (A,n);
Trang 14L For i:=1 to (n-1) do begin {lặp n-1 lần}
2 K:=I; {Coi phần tử đâu tiên của dãy là nhỏ nhât}
3s For j:=1+1 to n do;
4 If A[j] < A[k] then k:=j;
5 Loc := A[k]; A[k] := A[i]; A[i] := Loc;
6 And;
7 Reture
1.4 Đánh giá giải thuật
- Khi một giải thuật được thực hiện thường nó liên quan đến 2 yếu tố
+ Không gian nhớ cần thiết cho những cấu trúc lưu trữ
+ Thời gian cần thiết để thực hiện
Nếu Thời gian thực hiện giải thuật càng nhanh thì không gian nhớ cần thiết
cho cấu trúc lưu trữ đữ liệu càng lớn Thông thường thời gian thực hiện giải thuật vẫn được chú ý nhiều hơn Vì vậy ta sét tới việc đánh giá thời gian
thực hiện giải thuật
- Cùng một bài toán nếu giải thuật A1 có thời gian thực hiện là :
Ti(n)=8n
- Giải thuật A2 có thời gian thực hiện là : T;(n)=2n?
- Ta thay khi n đủ lớn thì T;(n) < T›(n) (Chỉ cần n=4) và n càng lớn thì
sự chênh lệnh càng rõ Như vậy lúc đó ta có thể nói:
- Khi n đủ lớn thì giải thuật A1 nhanh hơn giải thuật A2
1.5 Giải thuật đệ quy
1.5.1 Định nghĩa:
-_ Đệ quy là một khái niệm rất qua trọng trong tin hoc
- Một đối tượng gọi là đệ quy nếu nó bao gồm chính nó như một bộ phận
- Mét ham goi la đệ quy nếu trong định nghĩa của nó lại có dạng là chính nó
VD : Ham tinh giai thừa của một số nguyên dương với quy ước 0!=I thì
hàm này sẽ được định nghĩa như sau:
1 Néu n=0 thi n!=1
2 Néu N>0 thi n!= n(n-1)!
Nhu vay trong dinh nghia n! lai cé (n-1)! Do chinh 1a tinh dé quy
Trang 15VD: Ta muốn tính 4! Theo định nghĩa ta có:
Với số đầu là 1 và 1 thì số sau là tổng của hai số đứng trước nó Các
số này được cai là giá trị của ham Fib với đối số là số nguyên dương n
mà ta gọi là hàm Fibonacci Ta có thê định nghĩa hàm này như sau:
- Néu n=! hoac n=2 thì Fib(n)=1
- Néu n>2 thi Fib(n)=Fib(n-1) + Fib (n-2)
-_ Từ đó ta có thể viết giải thuật tính giá trị của Fib(n) dưới dạng thủ túc đệ quy
3 Bài toán tháp Hà Nội
Đây là một bài toán mang tính chất một trò chơi và có nội dung như sau:
Trang 16Có n đĩa kích thước nhỏ dần, đĩa có lỗ ở giữa , có thể sắp xếp chúng chồng
lên nhau xuyên qua một cọc, to ở dưới , nhỏ ở trên , để cuối cùng có một
chồng đĩa giống như cái tháp (Như dạng táp rùa ở hồ gương Hà Nội)
-_ Có n cọc A, B, C Hiện N đĩa đang được xếp ở cột A yêu cầu đặt ra: Chuyển cọc đĩa tir coc A sang cọc C, theo những điều kiện sau
1 Mỗi lần chỉ được chuyển 1 đĩa
2 Không khi nào có tình huống đĩa to ở trên, đĩa nhỏ ở dưới
3 Được phép sửa dụng 1 cọc làm cọc trung chuyên Chẳng hạn khi chuyển
từ A sang cọc C thì cọc B được làm cọc trung chuyển
Ta xét một vài trường hợp đơn giản
a N=1(Chỉ có một đĩa) thì ta chỉ cần 1 phép chuyển
Chuyển đĩa đang ở A sang C (Ký hiệu là A->C)
b N=2 phải thực hiện 3 phép chuyển
+ Chuyển đĩa thứ nhất từ cọc A sang cọc B (AB)
+ Chuyển dia thir 2 tir coc A sang coc C (ADC)
+ Chuyển đĩa từ cọn B sang cọc C (BDC)
c Trường hợp N>2
Ta thấy nếu coi (n-1) đãi ở trên đóng vai trò như đĩa thứ nhất thì có
thể hình dung như đang có 2 đĩa ở cọc A Nếu vay ta co thé có giải thuật như sau:
+ Chuyển (n-1) đĩa trên từ A->B
+ Chuyển dia thir n tr ADC
+ Chuyển (n-1) đĩa từ B->C
Vậy cách giả này mang tính chất đề quy và giải thuật tương ứng sẽ
được thể hiện qua thủ tục đệ quy như sau:
Procedure HaNoi(n, A, B, C)
1 Ifn=1 then chuyén dia tir A sang C
2 Else begin call HaNoi(n-1,A ,C, B)
Call HaNoi (1, A,B, C)
Trang 17Call HaNoi (n-1, B,A, C)
HANOI (1, B, C,A):B-> A HANOI (2, B, A, C) HANOI (1, B, A, C): BoC
HANOI (1, A, B,C): A> C
Trang 18
2 Giải thuật đệ quy thường gắn gọn và cách viết khá đơn giản đó là điều kiện thuận lợi cho người lập trình nếu như họ biết cách khai thác được tính đệ
quy trong phép giải Tuy nhiên điều đó không có nghĩa là chúng ta thực hiện
nhanh Với hàm giai thừa hoặc hàm Fibonacci néu 6 trén ta cd thể lập được
giải thuật không đệ quy (Dùng phép lặp đề tính) mà thời gian thực hiện sẽ nhanh hơn
3 Vi vay chỉ lên coi để quy là một công cụ để giải bài toán Đối với người làm
tin học cũng lên làm quen với cách tiếp cận đệ quy, khi thiết lập giải thuật,
và đánh giá được thời gian thực hiện giải thuật
4 Ngôn ngữ pascal,, hay C vv đều cho phép viết thủ tục dưới dạng đệ quy
Có nghĩa là chương trình dịch của ngôn ngữ này sẽ dảm nhiệm việc chuyển thủ tục đó sang một thủ tục tương đương mà không phải là để quy (Gọi là khử đệ quy) vì trong máy tính điện tử không hề có phép tính đệ quy
CHƯƠNG 2: CẤU TRÚC MẢNG
2.1 Định nghĩa:
Mang 1a tập hợp các ký tự , bao gồm một số xác định N phan tử (n được gọi là
độ dai hay kích thước của mảng) Ngoài giá trị mỗi phần tử của máng còn được đặc trưng bàng chỉ số index, thể hiện thứ tự của phần tử đó trong mảng Các giá trị của phần tử mảng đều cùng một loại
Đối với mảng thường có các phép toán sau:
+ Tạo lập một mảng
+ Duyệt qua các phần tử của mảng
+ Tìm kiếm một phần tư của mảng
SE Sắp xếp các phần tử trong mảng theo một thứ tự ấn định .vv
Vì số phần tử của mảng là có định lên không có phép bổ xung phần tử mới vào bảng hoặc loại bỏ phần tử ra khỏi mảng
- Vecto là mảng một chiều, mỗi phần tử của nó ứng với một chỉ số
VD: Phần tử véc tơ A, ký hiệu là A; hoặc A[ï] với ¡ là chỉ số
-_ Ma trận là mảng 2 chiều mỗi phần tử của nó ứng với 2 chỉ số
Vd: Phần tử ma trận B , ký hiệu là Bị hoặc B[Lj] với I là chỉ số hàng, j là chỉ
sô cột
Trang 192.2 Cấu trúc lưu trữ mắng
2.2.1 Khái quát về cách lưu trữ:
- _ Bộ nhớ của máy tính là một dãy các phần tử nhớ cớ sở được đánh số kế tiếp
nhau (kể từ số 0) Thứ tự đó được gọi là địa chỉ
-_ Có 2 cách để xác định địa chỉ ô nhớ
+ CI Đựa vào đặc tả lưu chữ dữ liệu đề tính trực tiếp ra địa chỉ Địa chỉ loại
này gọi là địa chỉ được tính (computer address) Cách này thường được sử dụng trong chương trình dich của các ngôn ngữ lập trình để tính địa chỉ các phần tử của mảng
+ C2 Lưu trữ các địa chỉ cần thiết ở một chỗ quy định, khi cần xác định sẽ lấy từ đó ra Loại đại chỉ này gọi là địa chỉ con trỏ (pointer) hoặc mối nối link
2.2.2 Lưu trữ kế tiếp đối với mắng:
- Thông thường mảng được lưu trữ trong máy dưới dạng vectơ (Gọi là vecto lưu tữ ) Đó là một dãy các từ máy kế tiếp nhau vì vậy gọi là các lưu trữ kế tiếp
VD: Luu mang 1 chiều hay 1 vecto A
+ Phần tử mảng là A[i] voi l<I<n
+ Mỗi phần tử của vecto được lưu trữ trong một ô nhớ gồm có 1 từ máy để thể hiện nó
+ Vậy để lưu vecto A thì phải dùng đến n từ máy kế tiếp nhau đó chính là n
phần tử của vecto lưu trữ V(V là vecto lưu trữ vecto đang xét) Phan tir V[i] của vecto V sẽ chứa phần tử A[ï] của vecto đang sét
+ Nếu mỗi phần tử của vecto lưu trữ V (Mỗi ô nhớ của V) phải gồm w thừ máy mới đủ chứa một phần tử A[ï] thì lúc đó V phải bao gồm n*w từ máy
kế tiếp Đại chỉ mỗi ô nhớ , nghĩa là mỗi phần tử V{ï] bây giờ là địa chỉ của
từ máy đầu tiên của ô nhớ
VD: nếu w=3 đại chỉ của V[1]=1000 thì đại chỉ của V[2]=1003, VỊ3]=1006
Trang 20Vii) V[2) VI] Vin]
-_ Đại chỉ của V[I] gọi là đại chỉ gốc ký hiệu là L,
- _ Như vậy việc xác định địa chi V[i] hay nói cách khách là A[i] được tính theo công thức như sau:
+ Khi mắng lưu trữ kế tiếp thì việc truy cập vào phần tử của mảng được
thực hiện một cách trực tiếp „ lên tốc độ truy cập nhanh
2.3 Áp dụng
Trang 212.3.1 Sắp xếp trên cấu trúc mảng
- _ Đặt bài toán: Sắp xếp là quá trình bố trí lại các phần tử của một tập đối
tượng nào đó theo một thứu tự ấn định
- VD: Cho mét day số A gồm n phần tửu khác nhau , mà ta coi như là n vecto
với n phần tử : A[1], A[2] , A[n]
Trong đó A[i]#A[i] voi i#j voi 1<= I, j<=n
Hãy sắp sếp các phần tir A dé chuyên nó thành một dãy số có thứ tự tăng
Quá trình sắp xếp được minh họa theo bảng sau:
Luot Sốnhỏnhấ A[I] A2] A[3] A[4] Al5] A6] AI7I A[R]
Dấu —_——————————¬ Chỉ dãy con chưa được sắp
b Sắp xếp theo kiểu thêm dần
- Nhu sap xép cac quan bai trén tay theo | tran tu nao đây
- V6i day sé A thi hoat dau A[1] coi như một dãy con được sắp xếp A[2] sẽ được xét tới : Nếu A[2]<A[1], thì nó được chèn vào trước A[1], còn nếu
2
Trang 22A[2] > A[I], nó sẽ được giữ nguyên tại chỗ (Coi như nó được chèn vào sau
A[1])
-_ Dãy con A[1], A[2] bây giờ coi như được sắp xếp, và A[3] được xét tới , tùy
theo kết qua cảu việc so sánh A[3] với A[2], A[I] nó lại được trèn vào hoặc
sau A[2], hoặc giữa A[1] và A[2], hoặc trước A[I]
- Qua trinh tiếp tục với A[4], A[5] cho tới khi toàn bộ dãy A được sắp xếp
lugt’ sốđượcxếi A[l]l A[2] A3] A4l AI] A[6] A[7] Als]
us
Sau đây là giải thuật sắp xếp kiểu thêm dần
Procedure insert- sort (A,n)
{Trong thủ tục này người ta dùng X làm một ô nhớ phụ để chứa khóa mới đang đc
xét }
1 {Khởi tạo số giả}
A[0]:= -œ { -œ© ký hiệu chỉ số nhỏ hơn mọi phần tử của A}
2 For i:=2 to n do begin
X= Afi]; j:=i-1;
3 {Xác định chỗ cho số mới đang được xét va dịch chuyên các số cần thiết }
While X < A[j] do begin
A[j+I]=All:
J:=J-1
End
23
Trang 234 {Đưa X vào đúng chỗ của nó}
A[i+Il=X
End ;
Return
c Sắp xếp kiểu đối chỗ (Giải thuật sắp xếp kiểu nổi bot)
Giải thuật này duyệt từ đáy lên Dọc đường nếu gặp 2 phần tử ngược thứ tự
(Nhia la A[1+1] < A[i] ) Nhu vậy sau lượt đầu phan tử nhỏ nhất của A sẽ ddc
chuyền lên đỉnh Lượt tiếp theo phần tử nhỏ nhất trong (n-1) phần tửu còn lại sẽ đc chuyền lên vị trí thứ 2 Cứ tiếp như vậy sau n-1 lần dãy A sẽ đc sắp xếp theo thứ
Giải thuật nỗi bọt đc sắp sếp như sau:
Procedure Bubble — Sort
1 For i:=1 to n-1 do
2 {Duyệt từ đáy lên}
For j:=n down to i+1 do
3 {Nếu ngược thứ tự thì đổi chỗ }
Tf A[j]< A[j-1] then
Trang 24Tìm kiếm một phần tử nào đó của một tập đối tượng theo một tiêu trí đã đề ra là
một bài toán rất phố biết trong tin học Ở đây ta xét tới một dạng đơn giản của nó
Cho một vecto A gồm n phần tử có giá trị là các số khác nhau
Function SEQ (A,n,X);
{Thủ tục này sẽ tìm xem trong các phần tử của A có phần tử nào có giá trị bằng
X hay không Nếu có thì nó ghi nhận lại chỉ số của phần tử đó , nếu không thì
nó ghi nhận số 0 Trong thủ tục này người ta đua vào phần tử giả A[n+1] mà giá trị của nó chính là X}
1 {Khởi tọa biên phần tử giả}
E=T?
A[n+Il]:=X;
2 {Tìm kiếm}
Trang 25While A[i] # X do I:=i+1;
{Thấy hay không thay}
If i:=n+1 then begin
Trong danh sách luôn có phần tửu đầu (Phần tửu thứ nhất) phần tử cuối
(Phần tửu thứ n) Với mỗi phần tử có phần tử trước nó (Trừ phần tử đầu ) và
phần tử sau nó ( trừ phần tủ cuối) Đối với ds thì thường có phép phải bổ
sung thêm phần tử mới loại bỏ đi phần tử cũ ngoài ra có thể còn có các phép
Lưu trữ kế tiếm đối với danh sách
- Cũng như đối với mảng , danh sách có thể được lưu trữ trong bộ nhớ bởi 1 vecto lưu trữ V gồm n ô nhớ kế tiếp Mỗi phần tửu A; của ds A sẽ đc lưu trữ trong một ô nhớ V[ï] (Phần tử thứ I của v) với 1<=I <=n
Lưu trữ móc nối đối với danh sách
3.3.1 Giới thiệu phương pháp
Trang 26- Mỗi phần tử của ds dược lưu trữ trong một ô nhớ ta gọi là nut
- Méi nit bao gén một số từ máy kế tiếp đủ để lưu trữ thông tin cần thiết đó là
thông tin ứng với mỗi phần tử của ds và đại chỉ nút tiếp theo
+ Trường INFO chứa thông tin ứng với phần tử của ds
+ Trường link chứa địa chỉ của nút tiếp theo
Chú ý: Riêng nut cuối cùng thì không có nút tiếp theo nữa lên đường link
cảu nó phải chứa một địa đặc biệt , chỉ mang tính chất quy ước dùng để đánh
dấu nút kết thúc đs
- Dé truy cập vào 1 nút trong ds thì phải biết được đại chỉ của nút đầu tiên
hay nói một cách khác phải nắm đc con trỏ L trior tới nót đầu tiên này
- _ Ví dụ ta có một ds sau, ta muốn công bố đs đó theo tứ tự từ điển, ta có thể tổ
chức theo kiêu móc nôi như sau:
Trang 27Mũi tên — : chỉ "mối nối" : địa chỉ nút tiếp theo
Dấu x : chỉ "mối nối không” (địa chỉ null)
Ở đây mối nối đã được thay bằng số thứ tự ( có thể coi đây là đc tương đối), mối nối không đã được ký hiệu bằng số 0 (Không có sft nào bằng 0 cả) Địa chỉ L ở đây bang 8 img véi nút đâu tiên của ds Có thé minh họa bằng hình anh sau:
28
Trang 28Nút dau tién dau ds này có đại chỉ là § dựa vào đường link ta có thể biết nút tiếp
theo có địa chỉ là 5
Cần chú ý là: Một cách tổng quát thì mỗi bút của đs móc nối có thé nam 6 bat ký
chỗ nào trong bộ nhớ và nhưu vậy địa chỉ nằm ở đường link ở mỗi nút là địa chỉ
thực cảu nút tiếp theo
- Người ta quy ước ds rong là ds không có chứa nút nào Lúc đó L=null
- Nếu P là con trỏ, trỏ đến một nut bat ky trong ds móc nói thì phần thông tin của phần tử tương ứng sẽ đc ký hiệu là Info(p)
- Phần địa chỉ của nút tiếp theo ksy hiệu là Link(p)
Câu lệnh Call new(p): Sẽ cho ta một nút trống với một quy các nhất định
và có địa chỉ p để sử dụng
- Call dispose (p): Tra lai cho ta ds trong rỗng nút có địa chỉ là P
3.3.2 Một số phép toán trên ds móc nối
1 Duyệt qua một ds móc nối
- _ Phép duyệt một ds móc nối là phép thăm từng nút trong ds đó mỗi nút chỉ thăm một lần , ở mỗi nút ta thực hiện một phép sử lý nào đó Bài toán đc
phát biểu như sau;
“ Cho một ds móc nối , con trỏ L trỏ tới nút đầu tiên trong ds hay in lan luot
phần thông tin của từng nút trong ds đó”
- _ Ta dùng một biến p đề ghi nhận địa chỉ của từng nút trong phép duyệt Ban
đầu p lấy giá trị của L, sau đó lần lượt lấy giá trị đại chỉ của các nút tiếp theo
(P được gọi là biến con trỏ)
Procedure travers (L);
1 If L:=Null then return; {nếu ds rỗng thì ko làm gì}
2 P:=L; {p lấy giá trị của L}
3 While p#null do begin
Trang 292 Bỗ sung thêm một nút vào ds
Cho một ds móc nối có con trỏ L trỏ tới nút đầu tiên Hãy bổ sung thêm một nút mớ vào trước nút đầu tiên này (Nếu có) Thông tin của nút mới này là A”
Procedure Insert (L,A)
1 {Tạo một nút mới}
Call new(p);
Info(p):=A {Gan A vao trudng info}
Link(p):=L {Gán địa chỉ L vào trường link}
3 Loại bó nút ra khỏi ds móc nối
“Cho đs móc nối với L trỏ vào nút đầu tiên trong ds, giả sử rằng ds nay không
rỗng hãy loại bỏ nút cuối cùng của ds”
Trang 30-_ Nếu đs chỉ có một nút thì nó cũng là nút cuối cùng và sau phép loại bỏ thì ds trở thành rỗng
-_ Ds có từ 2 nút trở lên thì không những phải tìm đến nút cuối cùng p với đặc điểm nhận biết là Link (p)=Null va phải tìm đến nút đừng trước nút cuối
cùng nữa để sửa mối nối của nút đó Vì vật giải thuật đước đây ta sẽ dùng 2
biến con trỏ để cuối cùng ghi nhận đại chỉ nút cuối danh sách và nút đứng
trước nút cuối cùng này
While Link(p)#null do p:=Link(p);
4, {Tìm kiếm nút đứng trước nút cuối cùng}
While link(q)#p do q:=link(q);
5 {Loại p ra khỏi ds, sửa nút q thành nút cuối của ds}
Call dispose(p);
Link(q):=Null;
6 Return
Ghép hai danh sách móc nối thành một
Cho 2 ds móc nói lần lượt được trỏ bởi P va Q” Biết rằng cả hai ds này đều
ko rỗng và trong đs P có một nút đc trỏ bởi con trỏ T(Có đại chỉ chính là T ) Hãy viết giải thuật chèn ds Q vào sau nút trỏ bởi T (Cuối cùng sẽ được một ds lớn hơn mà con trỏ trỏ tới nút đầu tiên cảu nó van 1a P)”
- Ta có thể hình dung danh sách trước và sau ghép như sau