Newer
Older
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
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include "tris.h"
void triInsertionDec(long* A, size_t n) {
for(size_t i = 1; i <= n-1; i++){
long cle = A[i];
size_t j = i - 1;
size_t ecriture=0;
while(j+1 >= j && A[j] > cle){
ecriture++;
A[j+1] = A[j];
j = j-1;
}
ecriture++;
A[j+1] = cle;
}
}
void triFusionDec(long* A, size_t size) {
sousTriFusionDec(A, 0, size);
}
void sousTriFusionDec(long* A, size_t first, size_t size) {
if(first+1 <size){ // p < r - 1
size_t middle = floor((first+size)/2);
sousTriFusionDec(A, first, middle);
sousTriFusionDec(A, middle, size);
fusionDec(A, first, middle, size);
}
}
void copySousTableDec(long* mainT, long* underT, size_t id, size_t size) {
for(size_t i = id; i < id+size; ++i) {
underT[i-id] = mainT[i];
}
}
void fusionDec(long* A, size_t first, size_t middle, size_t size) {
size_t n1 = middle - first; // Nb elem dans A[p , q] q exclu
size_t n2 = size - middle; // Nb elem dans A[q , r] r exclu
size_t indg = 0;
size_t indd = 0;
long* ag = malloc(sizeof(long) * n1);
long* ad = malloc(sizeof(long) * n2);
copySousTableDec(A, ag, first, n1);
copySousTableDec(A, ad, middle, n2);
int i = first;
while(i < size) {
if(indg == n1) {
A[i] = ad[indd];
indd++;
}
else if(indd == n2) {
A[i] = ag[indg];
indg++;
}
else if(ag[indg] < ad[indd]) {
A[i] = ag[indg];
indg++;
}
else {
A[i] = ad[indd];
indd++;
}
++i;
}
free(ag);
free(ad);
}
void triRapideDec(long* A, size_t n) {
sousTriRapideDec(A,0,n);
}
void sousTriRapideDec(long* A, size_t first, size_t size){
if(first+1 < size){
size_t middle = partitionDec(A,first,size);
sousTriRapideDec(A,first,middle);
sousTriRapideDec(A,middle+1,size);
}
}
size_t partitionDec(long* A, size_t first, size_t size) {
long pivot = A[size-1];
size_t i = first;
for(int j = first; j+2 <= size; j++){
if(A[j] <= pivot){
permuterDec(A,i,j);
i++;
}
}
permuterDec(A,i,size-1);
return i;
}
void permuterDec(long* A,size_t i,size_t j) {
long inter = A[i];
A[i] = A[j];
A[j] = inter;
}