Comment puis-je implémenter un algorithme de sorting rapide stable en utilisant un espace supplémentaire O (n)?

Je suis autorisé à utiliser un tableau supplémentaire pour effectuer un sorting rapide stable contrairement à l’algorithme général de sorting rapide. Je sais comment sélectionner le pivot de manière aléatoire et partitionner en conséquence, mais je ne suis pas en mesure de comprendre comment utiliser le tableau supplémentaire pour le rendre stable.

    La façon la plus simple qui me vienne à l’esprit est de stocker les index initiaux dans le tableau (1, 2, 3, etc.) et de les échanger au fur et à mesure que vous échangez les données.

    Ensuite, dans la comparaison, si les deux éléments sont égaux, comparez aussi leurs indices, ce qui le rend stable.

    Comme suggéré par Blindy et R, vous pouvez sortinger uniquement les index, puis une variante de sorting par cycle peut être utilisée pour sortinger le tableau d’origine à la place, avec pour effet secondaire que les index sortingés seront réorganisés de 0 à n-1. . Chaque mouvement place un élément en place, la complexité temporelle est donc O (n).

    void reorder_according_to(int array[], size_t indices[], size_t len) { size_t i, j, k; int t; for(i = 0; i < len; i++){ if(i != indices[i]){ t = array[i]; k = i; while(i != (j = indices[k])){ array[k] = array[j]; indices[k] = k; k = j; } array[k] = t; indices[k] = k; } } }