Bonjour, 

Envoyé par
emna1987
Ecrire un algorithme qui réarrange les éléments du tableau T de telle façcon que tous les nombres nuls apparaissent au début,suivis des nombres positifs, puis des nombres négatifs.
L'algorithme ne doit parcourir le tableau T qu'une seule fois et ne doit pas utiliser de tableau intermédiaires ...
La condition imposée du parcours unique constitue la grosse difficulté. Elle peut être contournée en définissant un nombre suffisant d'indices auxiliaires.
Soit donc le tableau de (N) termes:
VAR Liste: ARRAY[1..N] OF Type_Nombre;
Il est possible:
a) que le tableau commence une suite ininterrompue de (Iz) termes nuls, et
b) qu'il s'achève par une autre suite ininterrompue de (In) termes négatifs,
ce que l'on repère aisément par des instructions du type:
1 2 3 4 5
| Iz:= 0;
WHILE (Liste[Iz+1]=0) DO Inc(Iz);
k:= N + 1;
WHILE (Liste[k-1]<0)DO Dec(k);
In:= N + 1 - k; |
Il est encore possible (soyons optimistes) que l'on trouve ensuite:
c) une suite ininterrompue de (Ip1) termes positifs succédant aux termes nuls, et
d) une suite analogue de (Ip2) termes positifs précédant les termes négatifs,
ce que l'on trouvera facilement:
1 2 3 4 5 6
| k:= Iz;
WHILE (Liste[k+1]>0) DO Inc(k);
Ip1:= k - Iz;
k:= N + 1 - In;
WHILE (Liste[k-1]>0) DO Dec(k);
Ip2:= N + 1 - In - k; |
On a ainsi parcouru une fois - et une seule - un certain nombre de termes du tableau (N1 = Iz + Ip1 + Ip2 + In), situés aux deux extrémités de la liste (à moins évidemment qu'ils ne soient tous nuls: N1 >= 0).
Reste à traiter les (N - N1) termes restants, dont les positions vont de (Iz + Ip1 + 1) à (N - In - Ip2).
Cela doit pouvoir se traiter par des transferts de 2 termes, et variation des indices précédents, jusqu'à ce que l'on obtienne (condition d'arrêt):
N = Iz + Ip1 + Ip2 + In .
Partager