begin process at 2012 05 27 15:19:35
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > CSORTEDARRAY<TEMPLATE> VISUAL C++ MFC

CSORTEDARRAY<TEMPLATE> VISUAL C++ MFC


 Information sur la source

Note :
1 / 10 - par 1 personne
1,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Divers Classé sous :carray, tri, sort, quick, rapide Niveau :Initié Date de création :26/09/2005 Date de mise à jour :14/03/2006 10:07:25 Vu :8 521

Auteur : shenron666

Ecrire un message privé
Site perso
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

 Description

Une classe template dérivée du CArray des MFC
J'ai ajouté des méthodes de tri qui manquent cruellement
Vu que je manipule beaucoup de données au boulot, je m'en sert souvent

AddSorted(element) : ajoute "element" par insertion après recherche de sa position par dichotomie
Sort() : tri la table à l'aide d'un qSort
PartialSort(start, end) : tri une partie de la table avec qSort
Swap(src,dst) : échange 2 éléments dans la table

j'ai laissé les méthodes de tri partiel et de swap en public vu qu'elles ont leur utilité pour moi

Source

  • #pragma once
  • #include "afxtempl.h"
  • // Classe dérivée de CArray en reprenant toutes les capacités
  • // Ajout de méthodes de tri et d'ajout par insertion avec recherche de position par dichotomie
  • template <class TYPE, class ARG_TYPE = const TYPE&>
  • class CSortedArray : public CArray<TYPE, ARG_TYPE>
  • {
  • public:
  • INT_PTR AddSorted(TYPE newElement); // Ajout par insertion avec recherche de position par dichotomie
  • void Sort(void) { QuickSort(0, GetCount()-1); } // Effectue un tri complet de la table à l'aide la méthode QuickSort
  • void PartialSort(INT_PTR startIndex, INT_PTR endIndex); // Effectue un tri partiel de la table
  • void Swap(INT_PTR src, INT_PTR dst) { TYPE tmp=GetAt(src); SetAt(src, GetAt(dst)); SetAt(dst, tmp); } // Echange 2 éléments dans la table
  • protected:
  • void QuickSort(INT_PTR startIndex, INT_PTR endIndex);
  • };
  • // Ajoute un élément à la table par insertion en recherchant sa position par dichotomie
  • // Entrée : le nouvel élément à ajouter
  • // Sortie : l'index dans la table où le nouvel élément a été ajouté
  • template <class TYPE, class ARG_TYPE>
  • AFX_INLINE INT_PTR CSortedArray<TYPE, ARG_TYPE>::AddSorted(TYPE newElement)
  • {
  • INT_PTR start = 0, end = GetCount();
  • while(start < end)
  • {
  • INT_PTR pos = (start + end) / 2;
  • if(newElement > GetAt(pos))
  • start = pos + 1;
  • else
  • end = pos;
  • }
  • InsertAt(start, newElement);
  • return start;
  • }
  • // Effectue un tri QuickSort des éléments compris entre les index "A" et "B" (inclus)
  • // Entrée : l'index du premier élément et l'index du dernier élément à trier
  • template <class TYPE, class ARG_TYPE>
  • AFX_INLINE void CSortedArray<TYPE, ARG_TYPE>::PartialSort(INT_PTR startIndex, INT_PTR endIndex)
  • {
  • if(startIndex < 0)
  • startIndex = 0;
  • if(endIndex >= GetCount())
  • endIndex = GetCount() - 1;
  • if(startIndex >= endIndex)
  • return;
  • QuickSort(startIndex, endIndex);
  • }
  • // Méthode de tri QuickSort d'une portion de la table
  • // Entrée : l'index du premier élément à trier et l'index du dernier élément à trier
  • template <class TYPE, class ARG_TYPE>
  • AFX_INLINE void CSortedArray<TYPE, ARG_TYPE>::QuickSort(INT_PTR startIndex, INT_PTR endIndex)
  • {
  • if(startIndex >= endIndex)
  • return;
  • if(startIndex == endIndex - 1)
  • {
  • if(GetAt(startIndex) > GetAt(endIndex))
  • Swap(startIndex, endIndex);
  • return;
  • }
  • INT_PTR startToEnd = startIndex, endToStart = endIndex;
  • Swap((startToEnd + endToStart) / 2, endToStart);
  • TYPE middle = GetAt(endToStart);
  • while(startToEnd < endToStart)
  • {
  • while(GetAt(startToEnd) <= middle && startToEnd < endToStart) startToEnd++;
  • while(middle <= GetAt(endToStart) && startToEnd < endToStart) endToStart--;
  • if(startToEnd < endToStart)
  • Swap(startToEnd, endToStart);
  • }
  • SetAt(endIndex, GetAt(endToStart));
  • SetAt(endToStart, middle);
  • QuickSort(startIndex, startToEnd - 1);
  • QuickSort(endToStart + 1, endIndex);
  • }
#pragma once

#include "afxtempl.h"

// Classe dérivée de CArray en reprenant toutes les capacités
// Ajout de méthodes de tri et d'ajout par insertion avec recherche de position par dichotomie
template <class TYPE, class ARG_TYPE = const TYPE&>
class CSortedArray : public CArray<TYPE, ARG_TYPE>
{
public:
	INT_PTR AddSorted(TYPE newElement); // Ajout par insertion avec recherche de position par dichotomie
	void Sort(void) { QuickSort(0, GetCount()-1); } // Effectue un tri complet de la table à l'aide la méthode QuickSort
	void PartialSort(INT_PTR startIndex, INT_PTR endIndex); // Effectue un tri partiel de la table
	void Swap(INT_PTR src, INT_PTR dst) { TYPE tmp=GetAt(src); SetAt(src, GetAt(dst)); SetAt(dst, tmp); } // Echange 2 éléments dans la table

protected:
	void QuickSort(INT_PTR startIndex, INT_PTR endIndex);
};

// Ajoute un élément à la table par insertion en recherchant sa position par dichotomie
// Entrée : le nouvel élément à ajouter
// Sortie : l'index dans la table où le nouvel élément a été ajouté
template <class TYPE, class ARG_TYPE>
AFX_INLINE INT_PTR CSortedArray<TYPE, ARG_TYPE>::AddSorted(TYPE newElement)
{
	INT_PTR start = 0, end = GetCount();
	while(start < end)
	{
		INT_PTR pos = (start + end) / 2;
		if(newElement > GetAt(pos))
			start = pos + 1;
		else
			end = pos;
	}
	InsertAt(start, newElement);
	return start;
}

// Effectue un tri QuickSort des éléments compris entre les index "A" et "B" (inclus)
// Entrée : l'index du premier élément et l'index du dernier élément à trier
template <class TYPE, class ARG_TYPE>
AFX_INLINE void CSortedArray<TYPE, ARG_TYPE>::PartialSort(INT_PTR startIndex, INT_PTR endIndex)
{
	if(startIndex < 0)
		startIndex = 0;

	if(endIndex >= GetCount())
		endIndex = GetCount() - 1;

	if(startIndex >= endIndex)
		return;

	QuickSort(startIndex, endIndex);
}

// Méthode de tri QuickSort d'une portion de la table
// Entrée : l'index du premier élément à trier et l'index du dernier élément à trier
template <class TYPE, class ARG_TYPE>
AFX_INLINE void CSortedArray<TYPE, ARG_TYPE>::QuickSort(INT_PTR startIndex, INT_PTR endIndex)
{
	if(startIndex >= endIndex)
		return;

	if(startIndex == endIndex - 1)
	{
		if(GetAt(startIndex) > GetAt(endIndex))
			Swap(startIndex, endIndex);
		return;
	}

	INT_PTR startToEnd = startIndex, endToStart = endIndex;

	Swap((startToEnd + endToStart) / 2, endToStart);

	TYPE middle = GetAt(endToStart);

	while(startToEnd < endToStart)
	{
		while(GetAt(startToEnd) <= middle && startToEnd < endToStart) startToEnd++;
		while(middle <= GetAt(endToStart) && startToEnd < endToStart) endToStart--;
		if(startToEnd < endToStart)
			Swap(startToEnd, endToStart);
	}

	SetAt(endIndex, GetAt(endToStart));
	SetAt(endToStart, middle);

	QuickSort(startIndex, startToEnd - 1);

	QuickSort(endToStart + 1, endIndex);
}

 Conclusion

J'ai séparé la fonction de comparaison pour pouvoir la modifier facilement à votre convenance, par exemple pour trier dans l'ordre croissant ou décroissant


 Historique

15 décembre 2005 14:38:57 :
J'ai modifié la méthode de tri par une version plus rapide d'autant plus que j'avais un problème avec l'ancienne version utilisée dans une listbox de plus de 8000 éléments (dépassement de pile) la nouvelle version ne m'a pas explosée à la tête même avec 1 millions d'éléments (de type CItem contenant CString UINT et COLOREF entre autres)
06 mars 2006 18:06:09 :
Correction d'un plantage (tri d'un CSortedArray vide)
14 mars 2006 10:07:26 :
L'algo utilisé posait 2 problèmes le premier et non des moindres : il ne triait pas à 100%, erreur de ma part je n'avais pas mis la bonne version en ligne le second : si on triait un tableau déjà trié, on pouvait se retrouver avec un dépassement de pile (stack overflow). Le cas se posait presque systématiquement avec des tableaux de plus de 100.000 éléments. Tout cela est corrigé. Si néanmoins vous trouvez un bug, vous pouvez le signaler dans les commentaires ;-)

 Sources du même auteur

Source avec Zip CLASSE DE GESTION DE FICHIER DE TYPE INI (CHARGEMENT/SAUVEGA...
Source avec Zip Source avec une capture EXTRACTEUR / ANALYSEUR DE COMBOS (MFC)
Source avec Zip Source avec une capture OMBRES VOLUMÉTRIQUES D'OBJETS 3D EN UTILISANT LE STENCIL (C+...
Source avec Zip Source avec une capture VIEWER 3D ET GÉNÉRATEUR 2D WIN32 OPENGL VC++7
Source avec Zip Source avec une capture OMBRE PORTÉE ET UTILISATION STENCIL SOUS OPENGL

 Sources de la même categorie

Source avec Zip KISIEL CD INFO DRIVE par kisiel0147852
Source avec une capture SUPPRESSION DES REDONDANCES DE FICHIERS par cyberntique
Source avec Zip ÉDITEUR DE RECTANGLES EN CONSOLE par seoseo
CONVERSION DE FICHIER EN FICHIER BMP par seoseo
Source avec Zip DETECTEUR EJP par idpro

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture TROUVER LES NOMBRES PREMIERS INFÉRIEURS À UNE LIMITE DONNÉE par angrevol
LES OPÉRATIONS DE LA LISTE CHAINÉE par smaili
Source avec Zip LE QUICKSORT NON-RECURSIF ET L'IMPACT DE L'INSERTIONSORT SUR... par nickydaquick
QUICKSORT - NON RECURSIF par nickydaquick
Source avec Zip ALGORITHMES DE TRIS par NNAS

Commentaires et avis

Commentaire de Taron31 le 26/09/2005 18:41:04

toujours utile...

Commentaire de obooklage le 17/10/2005 21:46:16

J'ai des tableaux à trois dimensions à trier. Il est possible que ce code reponde aux besoins mais un exemple avec cette classe , meme simple , aurait ete le bien venu..

Commentaire de shenron666 le 18/10/2005 19:45:27

Il s'agit simplement d'un héritage de CArray MFC, l'utilisation est la même, tu déclares ta donnée :
CSortedArray<CString>   arStrs;

tu ajoutes des données avec : arStrs.Add(donnee);
puis tu tries le tableau avec : arStrs.Sort();
ou tu ajoutes directement la donnée avec : arStrs.AddSorted(donnee);
qui insèrera là donnée après avoir recherché la bonne place et qui renverra sa position

concernant tes tableaux à 3 dimensions par contre, il va faloir que tu modifies la classe ou que tu récupères la fonction de tri pour la reprendre
dans son état actuel cette classe ne te permettra pas de faire ce que tu cherches je pense

Commentaire de shenron666 le 14/03/2006 10:23:28

l'algo que j'utilisais posait trop de problèmes, j'ai donc recherché un autre algo et j'en ai trouvé un sur le site suivant :
http://www.cs.ubc.ca/spider/harrison/Java/sorting-demo.html
(il s'agit du quicksort "simple")

vous pouvez toujours vous amuser à l'améliorer en combinant plusieurs tris

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

encore un pb en c svp....... [ par natacha86 ] j'ai essayer de s&#233;parer les fonctions mais ca ne marche pas...#include &lt;conio.h&gt;#include &lt;stdio.h&gt;#include &lt;string.h&gt;#include & quick sort [ par eagleye ] je voulais savoir comment utiliser quick sort pour trier une liste chainee pouvez vous me donner le code en c ? tri rapide (quicksort) et/ou tri par tas(heapsort) urgent [ par mersniyassine ] je trouve une difficulté a simuler graphiquement en C ces 2 trisya t-il quelqu'un qui peut me fournir un code.c compilable sur Turbo C qui effectue u tri alphabétique ultra rapide de chaines de caractères de longueur variable [ par mslider ] -- Bonjour, je sais que c'est un forum dédié au C mais je vais parler de pascal. En effet je connais bien ce langage et je l'ai utilisé pour trier a Tri décroissant de tableau [ par enoitnaillal ] Bonjour, J’ai trouvé une variante de sort() : std ::sort (tb.begin(), tb.end(), std ::greater ()); permettant du faire un tri décroissant, (je travail tri rapide(quicksort)+tri par tas(heapsort)+simulation graphique [ par mersniyassine ] mon stage d'ete comporte une simulation graphique du tri par tas et du tri rapide, je trouve une difficulté a gerer le code source,merci bien de me fo Evenement trop rapide [ par larion ] Bonjour,Imaginons que nous avons 2 événements, pour exemple :evenement1: WM_LBUTTONDOWN --&gt; Action1evenement2: WM_LBUTTONUP --&gt; Action2S tri de voyelles et consonne [ par Kickri ] Bonjour a tous En faite j'ai une petite question : Comment vous verrez le fonctionnement d'un programme qui tri les voyelles et consonnes de cette ma Aide programme tri croissant et décroissant [ par nikesava ] Bonjour, je dois obtenir cet affichage de mon programme: Combien de valeurs vous desirez trier ? 5 Dans quel ordre desirez vous trier (1 pour croiss


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,123 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales