void ArcEnCiel::trier(int debut, int fin) { int gauche = debut - 1; int droite = fin + 1; const uint64_t pivot = _X[debut].idxT; if (debut >= fin) return; /* On parcourt le tableau, une fois de droite à gauche, et une autre de gauche à droite, à la recherche d'éléments mal placés, que l'on permute. Si les deux parcours se croisent, on arrête. */ while (1) { do droite--; while (_X[droite].idxT > pivot); do gauche++; while (_X[gauche].idxT < pivot); if (gauche < droite) echanger(gauche, droite); else break; } /* Maintenant, tous les éléments inférieurs au pivot sont avant ceux supérieurs au pivot. On a donc deux groupes de cases à trier. On utilise pour cela... la méthode quickSort elle-même ! */ trier(debut, droite); trier(droite + 1, fin); }
void ArcEnCiel::trier() { trier(0, _M - 1); }
static void extension_zone(int accrochage,int debut,int fin,int to,short *tableau) { #define POURCENTAGE 25 #define SEUIL 20 #define MAUVAIS_CHEMIN() #define ECART_CORRECT(a,b) ( (maximum(a,b) - minimum(a,b)) < minimum(SEUIL,(POURCENTAGE * minimum(a,b) / 100)) ) int trame,avant,i,m,j; RESULT table[AVANCE+1][cst_pics_amdf]; RESULT normal[cst_pics_amdf]; tableau[accrochage] = avant = to; /* ---------------on etend a gauche ---------------------------*/ for (trame=accrochage;trame>debut;) { table[0][0].rang = avant; for (i=1;i<=AVANCE && trame-i >=debut; i++) trier(trame-i,table[i-1][0].rang,table[i]); trier( m=maximum(trame-AVANCE , debut) ,avant,normal); i--; if ( table[i][0].rang != -1 && normal[0].rang != -1 && table[i][0].rang && normal[0].rang && avant && abs(TO_FREQ(table[i][0].rang) - TO_FREQ(avant)) > abs(TO_FREQ(normal[0].rang) - TO_FREQ(avant)) ) { for (j=1;j<=i; j++) tableau[trame-j] = interpolation(trame,avant,m,normal[0].rang,trame-j); trame -= i; avant = normal[0].rang; } else { if ( table[1][0].rang && ECART_CORRECT(TO_FREQ(avant),TO_FREQ(table[1][0].rang))) avant = tableau[--trame] = table[1][0].rang; else tableau[--trame] = 0; } } /* ------------------ on etend a droite -----------------------*/ avant = tableau[accrochage]; for (trame=accrochage;trame<fin;) { table[0][0].rang = avant; for (i=1;i<=AVANCE && trame+i <= fin; i++) trier(trame+i,table[i-1][0].rang,table[i]); trier( m = minimum(trame+AVANCE , fin) ,avant,normal); i--; if ( table[i][0].rang != -1 && normal[0].rang != -1 && table[i][0].rang && normal[0].rang && avant && abs(TO_FREQ(table[i][0].rang) - TO_FREQ(avant)) > abs(TO_FREQ(normal[0].rang) - TO_FREQ(avant)) ) { for (j=1;j<=i; j++) tableau[trame+j] = interpolation(trame,avant,m,normal[0].rang,trame+j); trame += i; avant = normal[0].rang; } else { if ( table[1][0].rang && ECART_CORRECT(TO_FREQ(avant),TO_FREQ(table[1][0].rang))) avant = tableau[++trame] = table[1][0].rang; else tableau[++trame] = 0; } } #undef MAUVAIS_CHEMIN #undef SEUIL #undef ECART_CORRECT #undef POURCENTAGE }