c) Vòng REPEAT
7.3 Sắp xếp số liệu trên mảng
Việc tìm kiếm một phần tử trên mảng sẽ dễ dàng nếu như mảng được sắp xếp ( sort) . Để sort mảng A gồm N phần tử có thể tiến hành qua N-1 bước như sau :
Bước 1: Tìm số lớn nhất trong số các phần tử A[1]...A[N] . Gán số lớn nhất cho A[N] .
Bước 2 : Tìm số lớn nhất trong các số A[1]...A[N-1]. Gán số lớn nhất cho A[N-1}
. . .
Bước N-1 : Tìm só lớn nhất trong 2 só A[1] và A[2}. Gán só lớn nhất cho A[2}
Ví dụ : giả sử rằng mảng A chứa 5 phần tử là các số nguyên như sau :
Thuật toán i =N
FOR N-1 times DO
find the position k of the largest element among A[1]..A[i] Swap A[i] and A[k] ( uses procedure SWAP )
i=i-1 END_FOR
Sau đây là chương trình để sort các phần trong mộ mảng . Chúng ta sẽ dùng thủ tục SELECT để chọn phần tử trên mảng . Thủ tục SELECT sẽ goị thủ tục SWAP để sắp xếp . Chương trình chính sẽ như sau :
TITLE PGM7_3: TEST SELECT .MODEL SMALL .STACK 100H .DATA A DB 5,2,,1,3,4 .CODE MAIN PROC MOV AX,@DATA MOV DS,AX LEA SI,A
MOV BX,5 ; số phần tử của mảng chứa trong BX CALL SELECT MOV AH,4CH INT 21H MAIN ENDP INCLUDE C:\ASM\SELECT.ASM END MAIN
Tập tin SELECT.ASM chứa thủ tục SELECT vàthủ tục SWAP được viết như sau tại C:\ASM .
SELECT PROC ; sắp xếp mảng byte
; input: SI = địa chỉ offset của mảng BX= số phần tử ( n) của mảng
; output: SI = điạ chỉ offset của mảng đã sắp xếp . ; uses : SWAP PUSH BX PUSH CX PUSH DX PUSH SI DEC BX ; N = N-1
JE END_SORT ; Nếu N=1 thì thoát
MOV DX,SI ; cất địa chỉ offfset của mảng vào DX ; lặp N-1 lần
SORT_LOOP:
MOV SI,DX ; SI trỏ tới mảng A MOV CX,BX ; CX = N -1 số lần lặp MOV DI,SI ; DI chỉ tới phần tử thứ nhất MOV AL,[DI] ; AL chứa phần tử thứ nhất ; tìm phần tử lớn nhất
FIND_BIG:
INC SI ; SI trỏ tới phần tử tiếp theo
CMP [SI],AL ; phần tử tiếp theo > phần tử thứ nhất ING NEXT ; không , tiếp tục
MOV DI,SI ; DI chứa địa chỉ của phần tử lớn nhất MOV AL,[DI] ; AL chứa phần tử lớn nhất
NEXT:
LOOP FIND_BIG
; swap phần tử lớn nhất với phần tử cuối cùng CALL SWAP
DEC BX ; N= N-1
JNE SORT_LOOP ; lặp nếu N<>0 END_SORT: POP SI POP DX POP CX POP BX RET SELECT ENDP SWAP PROC ; đổi chỗ 2 phần tử của mảng ; input : SI= phần tử thứ nhất ; DI = phần tử thứ hai
; output : các phần tử đã trao đổi PUSH AX ; cất AX
MOV AL,[SI] ; lấy phần tử A[i] XCHG AL,[DI] ; đặt nó trên A[k] MOV [SI],AL ; đặt A[k] trên A[i] POP AX ; lấy lại AX
RET
SWAP ENDP