1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
/*
============================================================================
Name : source.c
Author : SAMBIA39
Version : 0.1
Copyright : Copyright (c) 23/09/2016 SAMBIA39
Description : Ansi-style
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
/*
* Fonction qui fixe les indices.
* Elle permet par la suite deffectuer un tri de
* façon indirecte en déplaçant uniquement
* les valeurs des indices.
*/
void f_set_sequence( int Tab[], int TabId[],
size_t size ){
int i = 0;
int j = 0;
int v = 0; // Variable des valeurs
int id = 0; // Variable des Id
/*
* Acquisition des Indice
*/
for( i = 0; i < (int)size; i++ )
TabId[i] = i;
/*
* (1) Déplacement des éléments
* (2) Placement des indices
*/
for( i = 0; i < (int)size; i++ ){
id = TabId[i];
v = Tab[id];
j = i;
//(1)
while( 0 < j && ( v < Tab[ TabId[j-1]]) ){
TabId[j] = TabId[j-1];
j--;
}
//(2)
TabId[j] = id;
}
}
/*
* Fonction qui permet de trier le tableau initial
* grâce au tableau des indices
* (1) variable de end utilisé pour la permutation
* (2) variables dorigine utilisée pour la permutation
* (3) sauvegarde des valeurs
* (4) réorganisations
*/
void f_tris_indirect( int Tab[], int TabId[],
size_t size ){
int i = 0;
int i_s = 0;
int i_e = 0; //(1)
int i_v = 0; //(2)
for( i = 0; i < (int)size; i++ ){
//(3)
if( i != TabId[i] ){
i_v = Tab[i];
//(4)
i_e = i;
i_s = TabId[i_e];
while( i != i_s ){
Tab[i_e] = Tab[i_s];
TabId[i_e] = i_e;
i_e = i_s;
i_s = TabId[i_e];
}
Tab[i_e] = i_v;
TabId[i_e] = i_e;
}
}
}
/*
* Programme principale
*/
int main( void ){
int Tab[] = { 18, 3, 56, 10 };
int Itab[4];
unsigned int i = 0;
f_set_sequence( Tab, Itab, 4 );
fprintf( stdout, "Résultat de la séquence de tris\t:");
for( i = 0; i < 4; i++ )
fprintf( stdout, "%d ", Itab[i] );
fprintf( stdout, "\nSoit les valeurs suivantes\t:");
for( i = 0; i< 4; i++ )
fprintf( stdout, "%d(%d) ", Tab[i],i );
fprintf( stdout, "\nTableau des valeurs trié \t:");
f_tris_indirect(Tab, Itab, 4);
for( i = 0; i< 4; i++ )
fprintf( stdout, "%d ", Tab[i]);
fprintf( stdout, "\nFin de traitement");
return EXIT_SUCCESS;
} |
Partager