Sắp xếp xoắn ốc trong Pascal
Viết chương trình sắp xếp mảng vuông hai chiều (n hàng, n cột) theo hình xoắn ốc như sau:
Dữ liệu vào file: XOANOC.INP dòng đầu chứa n, các dòng sau chứa mảng vuông 2 chiều n hàng, n cột
Dữ liệu ra file: XOANOC.OUT chứa mảng 2 chiều n hàng, n cột đã sắp xếp
VD:
XOANOC.INP | XOANOC.OUT |
31 3 52 4 68 7 9 | 1 2 38 9 47 6 5 |
Chú ý: Có thể yêu cầu sắp xếp như sau:
code 1
uses crt; var i,j,k,t,s,n: integer; begin clrscr; write('Nhap n: '); readln(n); i:=1; j:=0; s:=n; t:=1; k:=0; for k:=1 to n*n do begin case t of 1 : j:=j+1; 2 : i:=i+1; 3 : j:=j-1; 4 : i:=i-1; end; gotoxy(j*3,i+2); write(k); if k=s then begin n:=n-(t mod 2); t:=t+1; s:=s+n; if t=5 then t:=1; end; end; readln end.
code 2
var i,j,k,t,s,n,m,tem: integer; a: array[1..50,1..50] of integer; b:array[1..2500]of integer; F:text; begin {---doc file ra mang mot chieu b-} assign(F,'xoanoc.inp');reset(F); read(F,n); k:=1; for i:=1 to n do for j:=1 to n do begin read(f,b[k]); k:=k+1; end; close(F); for j:=1 to n*n do write(b[j],' '); {-- sap xep mang mot chieu-------} for i:=1 to n*n-1 do for j:=i+1 to n*n do if b[i]>b[j] then begin tem:=b[i]; b[i]:=b[j]; b[j]:=tem; end; //for j:=1 to n*n do write(b[j],' '); {-------------Dat mang b vào mang a theo hinh xoan oc----------------} m:=n-1;i:=1;j:=1;k:=1; while m>0 do begin for t:=1 to m do begin a[i,j]:=b[k]; j:=j+1; k:=k+1; end; for t:=1 to m do begin a[i,j]:=b[k]; i:=i+1; k:=k+1; end; for t:=1 to m do begin a[i,j]:=b[k]; j:=j-1; k:=k+1; end; for t:=1 to m do begin a[i,j]:=b[k]; i:=i-1; k:=k+1; end; i:=i+1; j:=j+1;m:=m-2 end; if m=0 then a[n div 2+1,n div 2+1]:=b[n*n]; {-- xuat file ------} assign(F,'XOANOC.OUT'); rewrite(F); for i:=1 to n do begin for j:= 1 to n do write(f,a[i,j]:5); writeln(f); end; close(F); end.