さまざまなアルゴリズムの複雑さを比較するためのC++プロジェクトを作成します。私はサークルvector<Disque>
のベクトルを持っており、私はこのベクトルを円の属性x(左のx軸=> x軸の半径)でソートしたいと思います。私はマージソートアルゴリズムを実装していますが、動作しませんし、理由を知っていません。ベクトルのオブジェクト属性別にマージソート
マージソートの実装:
/**
* Méthode qui permet de fusionner les tableaux qui ont été séparés afin de trier le tableau final
* @param indice_bas
* @param milieu
* @param indice_haut
* @param taille
*/
void fusion(int indice_bas, int milieu, int indice_haut, vector<Disque> tableau) {
// Déclaration de différents indices pour la fusion
int h,i,j,k;
// Déclaration du tableau intérmediaire qui permet de stocké les disques du tableau
vector<Disque> tab_tmp;
// Initialisation des indices
h = indice_bas;
i = indice_bas;
j = milieu+1;
// Tant que nous avons pas trié l'ensemble du tableau
while((h <= milieu) && (j <= indice_haut)) {
// Si la valeurs de gauche est plus petite que celle de droite
if((tableau[h].getPoint().getX() - tableau[h].getRayon()) <= (tableau[j].getPoint().getX() - tableau[j].getRayon())) {
// On insère la valeur de gauche et on incrémente l'indice h
tab_tmp.push_back(tableau[h]);
h++;
} else {
// Sinon on interverti les valeurs du tableau afin de les remettrent dans l'ordre et on incrémente l'indice j
tab_tmp.push_back(tableau[j]);
j++;
}
// Incrémentation de i car tab_tmp[i] possède désormais une valeur
i++;
}
// Si il reste des valeurs à insérer dans le tableau temporaire, on les insère suivant si elles sont dans le tableau de droite ou de gauche
if(h > milieu) {
// Boucle qui permet d'insérer les valeurs restantes
for(k = j; k <= indice_haut; k++)
{
tab_tmp.push_back(tableau[k]);
i++;
}
} else {
// Boucle qui permet d'insérer les valeurs restantes
for(k = h; k <= milieu; k++) {
tab_tmp.push_back(tableau[k]);
i++;
}
}
// On replace les valeurs une à une dans le tableau que nous avons trié
for(k = indice_bas; k <= indice_haut; k++){
tableau[k] = tab_tmp[k];
}
}
/**
* Méthode tri fusion qui permet de trier les abscisse du point central d'un disque.
* Choix de cet algorithme car la complexité est en n log n
* @param indice_bas
* @param indice_haut
*/
void tri_fusion(int indice_bas, int indice_haut, vector<Disque> tableau, int taille){
// On déclare un indice qui correspond au milieu du tableau à trier pour effectuer un split
int milieu;
if(indice_bas < indice_haut) {
// Calcul du milieu du tableau
milieu = indice_bas + (indice_haut - indice_bas)/2;
// On appel récursivement la méthode de tri fusion jusqu'à la division de tous les tableaux
tri_fusion(indice_bas, milieu, tableau, taille);
tri_fusion(milieu + 1, indice_haut, tableau, taille);
fusion(indice_bas, milieu, indice_haut, tableau);
}
}
メイン:
// Fonction main qui est le point d'entrée du programme
int main(int argc, const char * argv[]) {
// Permet de générer plus d'aléa pour la création des disques
srand((unsigned)time(NULL));
// On crée quelques disques pour essayer les algos
vector<Disque> tabDisque;
for (int i=0; i < 10; ++i) {
tabDisque.push_back(Disque(rand() % 10 + 1, Point(rand() % 30 + 1, rand() % 30 + 1)));
}
// On récupère la taille du vector
int const taille = (const int)tabDisque.size();
tri_fusion(0, taille-1, tabDisque, taille);
for (int z = 0; z < taille ; z++) {
cout << tabDisque[z].getPoint().getX() - tabDisque[z].getRayon() << " ";
}
return 0;
}
おかげでフランスのコードの多くと申し訳ありません:)
正確には機能しません。残念ながら、私はフランス語を理解していませんが、コードはコンパイルされているようです。 – DuKes0mE
コードはコンパイルされますが、ベクトルはソートされません。出力の例: '-2 3 12 26 13 13 18 4 -3 -3'そして私は' -3 -3 -2 3 4 12 13 13 18 26' – Mattasse