Упрощенно как-то так... Не совсем по сишной реализации, но суть та же - если при проходе ничего не поменялось, это конец
Код:
label:
	ld hl,array
	ld b,arraysize-1
	ld c,0
loop:
	ld a,(hl)
	inc hl
	cp (hl)
	jr c,noswap
	ld d,(hl)
	ld (hl),a
	dec hl
	ld (hl),d
	inc hl
	ld c,1
noswap:
	djnz loop
	dec c
	jr z,label
	ret
В рег.C хранится флаг "был обмен элементов".