TP 2 : Algorithmes de tri

Documents pareils
Algorithmique I. Algorithmique I p.1/??

1.6- Génération de nombres aléatoires

I. Introduction aux fonctions : les fonctions standards

Algorithmes de recherche

RÉALISATION DE GRAPHIQUES AVEC OPENOFFICE.ORG 2.3

Logiciel EV3 LEGO MINDSTORMS Education

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Recherche dans un tableau

Programmation C++ (débutant)/instructions for, while et do...while

RapidMiner. Data Mining. 1 Introduction. 2 Prise en main. Master Maths Finances 2010/ Présentation. 1.2 Ressources

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Séance 0 : Linux + Octave : le compromis idéal

TP : Shell Scripts. 1 Remarque générale. 2 Mise en jambe. 3 Avec des si. Systèmes et scripts

Problème : Calcul d'échéanciers de prêt bancaire (15 pt)

MODE D'EMPLOI DE LA CALCULATRICE POUR LES COURTS SÉJOURS DANS L'ESPACE SCHENGEN

Propagation sur réseau statique et dynamique

Compte-rendu de projet de Système de gestion de base de données

Examen Médian - 1 heure 30

introduction Chapitre 5 Récursivité Exemples mathématiques Fonction factorielle ø est un arbre (vide) Images récursives

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

1 - Clients 2 - Devis 3 - Commandes 4 - Livraisons 5 - Factures 6 - Avoirs 7 - Modèles

C f tracée ci- contre est la représentation graphique d une

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

LibreOffice Calc : introduction aux tableaux croisés dynamiques

EPFL TP n 3 Essai oedomètrique. Moncef Radi Sehaqui Hamza - Nguyen Ha-Phong - Ilias Nafaï Weil Florian

Logiciel Libre Cours 3 Fondements: Génie Logiciel

FctsAffines.nb 1. Mathématiques, 1-ère année Edition Fonctions affines

CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE

SweetyPix, mode d'emploi

1 TD 2 : Construction d'une chier Acrobat et envoi par

Programmation Objet - Cours II

Procédure : Sauvegarder un Windows 7 sur un disque réseau

Architecture des Systèmes d Information Architecture des Systèmes d Information

Application 1- VBA : Test de comportements d'investissements

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Université du Québec à Chicoutimi. Département d informatique et de mathématique. Plan de cours. Titre : Élément de programmation.

Cours Langage C/C++ Programmation modulaire

Calculateur quantique: factorisation des entiers

Cours Informatique Master STEP

CORRECTION EXERCICES ALGORITHME 1

TP1. Outils Java Eléments de correction

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

INFORM :: DEMARRAGE RAPIDE A service by KIS

Vers l'ordinateur quantique

Algorithmique avec Algobox

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Outils pour la pratique

Télécom Nancy Année

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Par combien de zéros se termine N!?

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

"! "#$ $ $ ""! %#& """! '& ( ")! )*+

Baccalauréat L spécialité, Métropole et Réunion, 19 juin 2009 Corrigé.

Chapitre 7. Récurrences

v7.1 SP2 Guide des Nouveautés

CREATION D UNE EVALUATION AVEC JADE par Patrick RUER (

Guide pour la réalisation d'un document avec Open Office Writer 2.2

Cours 1 : La compilation

Trier les ventes (sales order) avec Vtiger CRM

modélisation solide et dessin technique

Quelques Algorithmes simples


Algorithmes d'apprentissage

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Ordonnancement. N: nains de jardin. X: peinture extérieure. E: électricité T: toit. M: murs. F: fondations CHAPTER 1

Projet ISN - dossier réalisé par Randrianarimanana Stéphanie. Titre du projet : Site de rencontre. le nom de notre site de rencontre : Linkymeet

Algorithmes récursifs

Raja Bases de données distribuées A Lire - Tutoriel

Algorithmique et Programmation, IMA

Table des matières. 10 Gimp et le Web. Option de traitement d'images Mémento pour la séance N o Création d'animation

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Découverte du tableur CellSheet

S LICENCE INFORMATIQUE Non Alt Alt SS1 S2 S3 S4 S5 S6 Parcours : IL (Ingénierie Logicielle) SRI (Systèmes et Réseaux Informatiques)

Monter une photo en médaillon

Nuxeo 5.4 : les nouveautés

Algorithmique avec Algobox

Créer un tableau avec LibreOffice / Calc

Master Modélisation Aléatoire Paris VII, Cours Méthodes de Monte Carlo en nance et C++, TP n 2.

Peut-on tout programmer?

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

REALISER UN SITE INTERNET AVEC IZISPOT SOMMAIRE

Cours d initiation à la programmation en C++ Johann Cuenin

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Programmation C. Apprendre à développer des programmes simples dans le langage C

PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES

Guide de démarrage rapide Centre de copies et d'impression Bureau en Gros en ligne

Introduction à MATLAB R

Bien lire l énoncé 2 fois avant de continuer - Méthodes et/ou Explications Réponses. Antécédents d un nombre par une fonction

Compression de Données - Algorithme de Huffman Document de Conception

Initiation à la programmation en Python

Editer un catalogue avec OpenOffice

Initiation à l algorithmique

Plan du cours Cours théoriques. 29 septembre 2014

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Guide d'utilisation. OpenOffice Calc. AUTEUR INITIAL : VINCENT MEUNIER Publié sous licence Creative Commons

Transcription:

Master de sciences et technologie 1 Mention : mathématiques et applications 4M016 Initiation au C++ 2016-2017 TP 2 : Algorithmes de tri 1 Compilation séparée Le but de cet exercice est de vous familiariser à la compilation séparée permettant de répartir son code sur plusieurs chiers, éventuellement compilable séparément. On va créer trois chiers : "add.cpp" contient la dénition d'une fonction additionnant deux entiers. "add.h" contient la déclaration de la fonction dénie dans "add.cpp". "main.cpp" contient la fonction main qui va appeler la fonction dénie dans "add.cpp". Commencez par : 1) Créez un chier "add.cpp" qui contient la dénition d'une fonction qui ajoute deux nombres entier, appelez-la par exemple "add". 2) Créez un chier "add.h" qui contient la déclaration de la fonction "add". 3) Créez un chier "main.cpp" qui demande l'utilisateur de tapez deux nombres dans le shell et puis qui ache la somme des deux nombre dans le shell. Il vous faudra inclure le chier d'entête à l'aide de la commande #include "add.h". Première méthode de compilation : 4) Compilez tout par la commande g++ main.cpp add.cpp -o main1 et executez votre programme (en tapant./main1). Deuxième méthode de compilation : 5) Compilez d'abord le chier "add.cpp" par la commande g++ -c add.cpp et puis le chier "main.cpp" par la commande g++ -c main.cpp. Renseignez-vous sur le -c dans la commande. Finalement, créez un executable par la commande g++ main.o add.o -o main2. Testez votre programme (tapez./main2). 2 Trois algorithmes de tri On s'intéresse ici au problème de tri d'une suite de N entiers, c'est-à-dire ranger dans l'ordre croissant une suite nie d'entiers initialement placés dans le désordre. Prenons par exemple la suite suivante de 10 entiers naturels 11 54 23 6 7 89 4 2 8 45, 1

on veut donc obtenir au nal : 2 4 6 7 8 11 23 45 54 89. Pour réaliser cela, il existe de nombreux algorithmes de tri. Au cours de cette séance nous allons en voir trois. Nous en verrons d'autres aux séances suivantes. 2.1 Travail demandé : Pour chacune des méthodes de tri ci-dessous, vous écrirez une fonction implémentant l'algorithme correspondant. Cette fonction appellera elle-même, si besoin, des sous-routines de votre invention. Cette fonction prendra En entrée : un int* représentant un tableau d'entiers dans le désordre un int représentant la taille du tableau à trier En sortie : un int* représentant le même tableau d'entiers rangés par ordre croissant Ensuite, étant donné un algorithme de tri, vous écrirez un programme executable (i.e. une fonction main) qui 1) fait une boucle sur N pour N = 10, 20, 50, 100, 200, 500, 1000 et pour chaque N eectue les opérations suivantes : * génère aléatoirement un tableau d'entiers de taille N * appelle l'algorithme de tri en l'appliquant au tableau généré * mesure le temps d'execution en seconde de l'algorithme de tri et stocke le résultat 2) exporte au format de gnuplot les données de la courbe qui donne le temps d'execution en fonction de N, 3) trace la courbe correspondante avec gnuplot, en prenant une échelle logarithmique en abscisse comme en ordonnée. Libre à vous si vous le souhaitez d'utiliser un autre logiciel que gnuplot, mais permettant d'acher des courbes. Pour la génération aléatoire de tableau, on pourra utiliser la routine rand de la librairie standard (voir par exemple : http://www.cplusplus.com/reference/cstdlib/rand/ ). Pour appeler gnuplot ou lancer des commande shell depuis un programme C++, on pourra utiliser system (voir : http://www.cplusplus.com/reference/cstdlib/system/ ). 2.2 Le tri à bulles Ce algorithme naif, très répandu mais inecace, peut être traduit de la façon suivante. On commence par le premier terme. S'il est supérieur au terme suivant, on les échange. 2

11 54 23 6 7 89 4 2 8 45 Ensuite, on regarde le deuxième terme, qui est comparé avec le troisième terme. Si le deuxième terme est supérieur au troisième, on les échange. 11 23 54 6 7 89 4 2 8 45 On continue en passant au troisième terme... jusqu'à ce que l'on soit arrivé à la n de la suite. 11 23 6 7 54 4 2 8 45 89 On vérie aisément qu'à ce stade, le dernier élément (l'élément 10) est l'élément ayant la plus grande valeur de la suite, donc il est bien placé. On renouvelle alors l'opération maintenant sur la suite allant de l'élément 1 à l'élément 9. À la n de cette opération, on aura l'élément 9 qui sera inférieur à l'élément 10 et supérieur à tous les autres. 11 6 7 23 4 2 8 45 54 89 On continue jusqu'à ce que la taille de la sous-suite soit à un et on obtient 2 4 6 7 8 11 23 45 54 89. 2.3 Le tri par insertion Voici un autre algorithme qui est ecace pour trier les petits tableaux, mais pas les grands. Le principe est le suivant. Supposons que les k premiers termes de la suite soient ordonnés par ordre croissant (ici k = 4). 6 11 23 54 7 89 4 2 8 45 L'objectif est d'insérer l'élément k + 1 à la bonne place dans la sous-suite composée des k premiers termes. Pour cela, on échange les éléments k et k + 1, puis k 1 et k... jusqu'à ce que la sous-suite composée des k + 1 premiers termes soit ordonnée. 6 7 11 23 54 89 4 2 8 45 On passe ensuite à l'étape suivante, c'est-à-dire insérer l'élément k + 2 dans la sous-suite composées des k + 1 premiers termes. L'algorithme débute par l'insertion du deuxième élément dans la sous-suite composée du premier terme. 2.4 Le tri par fusion Il s'agit d'un algorithme récursif beaucoup plus ecace basé sur un principe de type "divide and conquer" (diviser pour régner). Cet algorithme s'appuie sur une routine intermédiaire merge (fusion) qu'il faut d'abord introduire avant de pouvoir présenter l'algorithme de tri proprement dit. 3

Présentation de la sous-routine merge Cette routine prend en entrée un int* représentant un tableau d'entiers dans le désordre que nous noterons ici T, et trois int que nous noterons p, q, r tels que p q < r. Elle renvoie en sortie un int* représentant le même tableau d'entiers tel que les nombres T[p], T[p + 1],... T[r] soient rangés par ordre croissant. Le point important est que, pour eectuer cette opération de tri partiel, elle présuppose que la série T[p], T[p + 1],... T[q] d'une part, et la série T[q + 1], T[q + 2],... T[r] d'autre part, sont rangées par ordre croissants. Voici le principe algorithmique de cette routine merge. On compare d'abord T[p] et T[q]. On retient le plus petit des deux nombres, ce qui donne un premier résultat que l'on stocke. Mettons ici qu'il s'agisse de T[p]. On compare ensuite T[p + 1] et T[q]. On retient le plus petit, ce qui donne un deuxième résultat que l'on stocke à la suite du premier résultat, mettons ici T[q]. On compare enuite T[p + 1] et T[q + 1], on retient le plus petit,...et ainsi de suite. Voici ci-dessous un exemple d'application de cet algorithme avec, à gauche les deux soustableaux à fusionner, et à droite le résultat de la fusion, itération par itération. En gris sont colorées les entrées à comparer dans les sous-tableaux. Itération 1 : 6 7 11 23 2 3 9 20 2 Itération 2 : 6 7 11 23 2 3 9 20 2 3 Itération 3 : 6 7 11 23 2 3 9 20 2 3 6 Itération 4 : 6 7 11 23 2 3 9 20 2 3 6 7 Itération 5 : 6 7 11 23 2 3 9 20 2 3 6 7 9 Itération 6 : 6 7 11 23 2 3 9 20 2 3 6 7 9 11 Itération 7 : 6 7 11 23 2 3 9 20 2 3 6 7 9 11 20 23 4

Algorithme merge sort Une fois que l'on a à disposition une sous-routine de fusion, l'algorithme de tri par fusion prend la forme très simple suivante : MergeSort(T, p, r) if(p<r){. q = (p + r)/2. MergeSort(T, p, q). MergeSort(T, q + 1, r). Merge(T, p, q, r) } Dans cet algorithme n désigne la partie entière de n. Pour trier le tableau en entier il sut alors d'appeler MergeSort avec p = 0 et r = longueur(t) -1. 5