Цитата(lansel @ 28.9.2008, 20:44 ) | | Как будет выглядить на си Label и эти Goto ?? |
Они и в Дельфи не нужны... Сначала избавляемся от них:
| Код | Procedure Singl(Var A: Array of tip); Var t, tt:tip; i, j, k, L, m, ii, ij: integer; IL,IU: Array[0..25] of integer;
b: boolean; begin b := false;
m := 0; i := 0; j := High(A); ii :=i; repeat repeat if b then begin ij := (i+j) div 2; t := A[ij]; k := i; L := j; Inc(z, 2);
If A[i].key > t.key then begin A[ij] := A[i]; A[i] := t; t := A[ij] end;
If A[j].key < t.key then begin A[ij] := A[j]; A[j] := t; t := A[ij]; Inc(z); If A[i].key > t.key then begin A[ij]:=A[i]; A[i]:=t; t:=A[ij] end end;
repeat repeat Inc(z); Dec(L) until A[L].key <= t.key; tt := A[L];
repeat Inc(z); Inc(k) until A[k].key >= t.key;
If k <= L then begin A[L] := A[k]; A[k] := tt; end; until K > L;
If L-i > j-k then begin IL[m] := i; IU[m] := L; i := k end else begin IL[m] := k; IU[m] := j; j := L end;
Inc(m);
end; // if(b) ... b := true;
until j-i <= 9;
If i = ii then begin L :=i; For k := i+1 to j do begin Inc(z); If A[k].key < A[L].key then L := k end; t := A[i]; A[i] := A[L]; A[L] := t end;
for i := i+1 to j do begin t := A[i]; k := i-1; Inc(z); If A[k].key > t.key then begin Repeat Inc(z); A[k+1] := A[k]; Dec(k) Until A[k].key <= t.key; A[k+1] := t end end;
Dec(m); If m>=0 then begin i := IL[m]; j := IU[m]; b := false; end
until m < 0; end; |
"А уж опосля... " (С) "Иван Васильевич меняет профессию"
| Код | void Singl(tip *A, int size) { int IL[26], IU[26]; int m, i, k, L, ij; tip t, tt;
bool b = false; m = i = 0; int j = size; int ii = i;
do { do { if(b) { ij = (i+j) / 2; t = A[ij]; k = i; L = j; z += 2;
if(A[i].key > t.key) { A[ij] = A[i]; A[i] = t; t = A[ij]; } if(A[j].key < t.key) { A[ij] = A[j]; A[j] = t; t = A[ij]; z += 1; if(A[i].key > t.key) { A[ij] = A[i]; A[i] = t; t = A[ij]; } }
do { do { z += 1; L -= 1; } while(A[L].key > t.key); tt = A[L];
do { z += 1; k += 1; } while(A[k].key < t.key);
if(k <= L) { A[L] = A[k]; A[k] = tt; } } while (k <= L);
if(L-i > j-k) { IL[m] = i; IU[m] = L; i = k; } else { IL[m] = k; IU[m] = j; j = L; }
m += 1; } b = true;
} while(j-i > 9);
if(i == ii) { L = i; for(k = i+1; k <= j; k++) { z += 1; if(A[k].key < A[L].key) L = k; } t = A[i]; A[i] = A[L]; A[L] = t; }
for(i = i+1; i <= j; i++) { t = A[i]; k = i-1; z += 1; if( A[k].key > t.key) { do { z += 1; A[k+1] = A[k]; k -= 1; } while(A[k].key > t.key); A[k+1] = t; } }
m -= 1; if( m>=0) { i = IL[m]; j = IU[m]; b = false; } } while(m >= 0); }
|
Вызывать теперь вот так:
| Код | Singl(X, n); // передаем размер тоже...
|
|