2012
Informatique
MP
4heuresCalculatricesautorisées
Les candidatsindiqueronten têtedeleurcopielelangage deprogrammationchoisi(PascalouCaml).Les
candidatsayantchoisiCamldevrontdonner letypedechaquefonctionécrite, lorsque celui-ci n’estpasimposé.
Les candidatstravaillanten Pascalpourrontécriredes fonctionsoudes procédures.
Choixdupivotdans letrirapide
L’objetde ce problème estle choixd’un pivot dansl’algorithmedu trirapide.Ons’intéresseau trienordre
croissantd’un tableau d’entiersquipourront toujoursêtresupposésdistincts.
EnPascal,on disposedu typetableau suivant:
const long_tab =1000;
type tableau =array[0..long_tab-1] of integer;
La longueurtdestableauxavec lesquelson travailledevradonc êtremajorée par long_tab etlesdonnées sont
alorsprésentesdanslazoneindexée par 06i6t−1.Cettelongueurutiletdevradonc être éventuellement
donnée en paramètre.
EnCaml,on rappellequelalongueurd’un tableau estdonnée par vect_length enCaml lightetArray.length
enOcaml.
ITrirapided’un tableau
I.A–Écrireunefonction/procédureechange réalisantl’échange dedeuxélémentsd’un tableau.
echange :int -> int -> int vect -> unit =<fun>
procedure echange(i, j : integer ;var t : tableau);
I.B–Décrireun algorithmesimpledetri ; évaluersacomplexitédanslepiredescas entermesde compa-
raisons.Le programmer.
I.C–L’algorithmedu trirapidesurun tableau consiste en unepremière étapeoù on permuteleséléments
du tableau desortequelesélémentspluspetits(respectivementplusgrands)qu’un pivot psoientplacésavant
(respectivementaprès)cetélémentpdansletableau.Onexécute ensuiterécursivementletrirapidesurlesdeux
partiesdu tableau ainsiséparéespar p.
Par exemple, letableau [|19;7; 17; 14; 22; 5; 26; 21; 2; 12|]devientaprèslapremière étape(sion choisit19 comme
pivot):[|2; 7; 17; 14; 12; 5; 19;21; 26; 22|].Notonsquelesélémentsinférieurs(respectivementsupérieurs)à19
peuventêtrepermutésentre eux.Le pointcrucial estqu’ils soientsituésavant (respectivementaprès)19 dans
letableau.
Un desintérêtsimportantsde cetalgorithme estqu’il peutêtreréalisé en place: letableau neserajamais
recopié.Pourcela, lesappelsrécursifsprendrontcommeargumentslesindicesdélimitantlapartieàtrier.
I.C.1) Expliquercommenton peutréaliseren placelaphasedeséparation du tableau entempsO(n),avec
nlalongueur(nombred’éléments)du (sous-)tableau àtraiter.
I.C.2) Écrireunefonction separation prenantenentrée un vecteurvetdeuxindicesi1eti2(avec 06i1<
i26t−1,condition queleprogrammen’aurapas àvérifier),ayantpourfonction deséparerlesous-tableau
v[i1+1..i2]selon lepivot p=v(i1),etretournantl’indice du tableau correspondantàlaposition depdans
vaprès séparation.Dansl’exempleprécédent, l’appelseparation v0 0 9 (Caml)ou separation(v0,0,9)
(Pascal)retournel’indice 6etlevecteurv0aétémodifié.
separation: ’a vect -> int -> int -> int =<fun>
function separation(var v: tableau ;i1, i2: integer): integer;
I.C.3) Écrireunefonction tri_rapide réalisantletrid’un vecteur/tableau enappliquantl’algorithmedécrit
plushaut.
II Étudedecomplexité
Ons’intéressemaintenantàlacomplexitédu trirapidedansdeuxcas particuliers.
II.A–Donnerun ordredegrandeurdu nombrede comparaisonseffectuéeslorsqueletableau estdéjàtriédans
l’ordre croissant (respectivementdécroissant).Sansforcémentdonnerun équivalentde ce nombrede comparaison
C(n),on donnera(enjustifiant) unevaleursimplev(n)tellequeC(n)=O(v(n)) etv(n)=O(C(n)).