Procedure Merge(k:integer; f1,f2,g1,g2: File of RecordType); {Thủ tục này trộn các đường độ dài k và trong hai tập tin f1 và f2 thành các đường đọ dài 2k và ghi luân phiên vào trong hai tập tin g1 và g2} var OutSwithh : boolean; {Nếu OutSwitch = TRUE thì tin g1, ngược lại ghi vào g2} ghi vào tập | Giải thuật CTDL và giải thuật lưu trữ ngoài Bước 5 Đổi vai trò của F1 và G1 F2 và G2 cho nhau. Trộn các đường độ dài 16 trong hai tập tin F1 và F2 được 1 đường độ dài 23 rồi ghi vào trong tập tin G1. G1 2 5 8 8 9 10 10 10 13 13 22 30 31 39 40 54 65 69 77 85 90 96 98 Tập tin G1 chứa các mẩu tin đã được sắp còn tập tin G2 rỗng. Chương trình procedure Merge k integer f1 f2 g1 g2 File of RecordType Thủ tục này trộn các đường độ dài k và trong hai tập tin f1 và f2 thành các đường đọ dài 2k và ghi luân phiên vào trong hai tập tin g1 và g2 var OutSwithh boolean Nếu OutSwitch TRUE thì ghi vào tập tin g1 ngược lại ghi vào g2 Winner integer Để chỉ định mẩu tin hiện hành nào trong hai tập tin f1 và f2 sẽ được ghi ra tập tin g1 hoặc g2 Used array of integer Used ij ghi số mẩu tin đã được đọc trong đường hiện tại của tập tin fj Fin array Of boolean Fin j sẽ có giá trị TRUE nếu đã đọc hết các mẩu tin trong đường hiện hành của fj họac đx dến cuối tập tin fj Current array Of RecordType Current j để lưu mẩu tin hiện hành của tập tin f j procedure GetRecord i integer Nếu đã đọc hết các mẩu tin trong đường hiện hành của tập tin fi hoặc đã đến cuối tập tin fi thì đặt fin i TRUE nếu không thì đọc một mẩu tin của tập tin fi vào trong current i begin Used i Used i 1 if Used i k 1 or i 1 and eof fl or i 2 and eof f2 then fin i TRUE else if i 1 then Read f1 current 1 else read f2 current 2 end begin Khởi tạo OutSwitch TRUE ReSet f1 ReSet f2 Nguyễn Văn Linh Trang 89 Giải thuật CTDL và giải thuật lưu trữ ngoài ReWrite gl ReWrite g2 while not eof fl or not eof f2 do begin Bắt đầu đọc các mẩu tin từ trong hai đường hiện hành của hai tập tin f1 f2 Used 1 0 Used 2 0 Fin 1 FALSE Fin 2 FALSE GetRecord 1 GetRecord 2 while not fin 1 or not fin 2 do begin Trộn hai đường Chọn Winner if Fin 1 then Winner 2 else if Fin 2 then Winner 1 else if current 1 .key Current 2 .key then Winner 1 else Winner 2 if OutSwitch then Write g1 Current winner else Write g2 current winner GetRecord .