This repository has been archived by the owner on Oct 21, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
qsort.cpp
184 lines (148 loc) · 4.36 KB
/
qsort.cpp
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
//
// qsort.cpp
//
// Created by Olivier Cuisenaire on 10.04.15.
// Copyright (c) 2015 Olivier Cuisenaire. All rights reserved.
// modified by Lemdjo
#include <iostream>
#include <utility>
#include <climits>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
// selectPivot(begin,end)
//
// choisit un pivot pour le tri rapide parmi le tableau
// entre begin et end (non inclus). Calcule la médiane
// entre le premier, le dernier et l'élément central.
// retourne un iterateur du même type que begin et end
// pointant sur la valeur choisie.
//
// NE RIEN MODIFIER DANS CETTE FONCTION
template < typename RandomAccessIterator >
RandomAccessIterator selectPivot(const RandomAccessIterator begin,
const RandomAccessIterator end) {
RandomAccessIterator p1 = begin;
RandomAccessIterator p2 = begin + (end - begin) / 2;
RandomAccessIterator p3 = end - 1;
if (*p1 < *p2) {
if (*p2 < *p3) return p2;
else if (*p1 < *p3) return p3;
return p1;
} else {
if (*p1 < *p3) return p1;
else if (*p2 < *p3) return p3;
return p2;
}
}
// display
//
// Affiche les valeur entre begin et end (non inclus)
// en entourant de [] la valeur du pivot située entre
// begin et end.
//
// NE RIEN MODIFIER DANS CETTE FONCTION
template < typename RandomAccessIterator >
void display(const RandomAccessIterator begin,
const RandomAccessIterator pivot,
const RandomAccessIterator end) {
for (auto it = begin; it < pivot; ++it) cout << *it << " ";
cout << "[" << *pivot << "] ";
for (auto it = pivot + 1; it < end; ++it) cout << *it << " ";
cout << endl;
}
// quickSort
//
// Effectue le tri rapide des éléments entre begin
// et end (non inclus). Doit appeler selectPivot(...)
// pour le choix du pivot, et display() après chaque
// partition
//
// A COMPLETER
template < typename RandomAccessIterator >
RandomAccessIterator partitionner(RandomAccessIterator begin,
RandomAccessIterator end) {
RandomAccessIterator i = begin-1;
RandomAccessIterator j = end;
while (1) {
do{
i++;
}while (*i < *end);//Vérifie que les élements à gauche du pivot sont inférieurs
do{
j--;
}while (j > begin and *j > *end);//Vérifie que les élements à droite du pivot sont supérieurs
if (i >= j)
break;
swap(*i, *j);
}
swap(*i, *end);
return i;
}
template < typename RandomAccessIterator >
void quickSort(RandomAccessIterator begin,
RandomAccessIterator end) {
RandomAccessIterator i ;
RandomAccessIterator j ;
RandomAccessIterator hi= end-1;
if (end <= begin)//Condition d'arret
return;
RandomAccessIterator pivot = selectPivot(begin, end); //Choisit l'élément pivot
swap(*pivot, *hi); //permute l'élement pivot avec le dernier élément de la liste
i = begin-1;
j = hi;
while (1) {
do{
++i;
}while (*i < *hi);/*Vérifie que les élements à
gauche du pivot sont inférieurs*/
do{
--j;
}while (j > begin and *j > *hi);/*Vérifie que les élements
à droite du pivot sont supérieurs*/
if (i >= j)
break;
swap(*i, *j);
}
swap(*i, *hi);//Echange deux élements pointés par i et hi
if(begin != end-1)
display(begin, i, end);
quickSort(begin,i);
quickSort(i+1, end);
}
// main
//
// Programme testant la mise en oeuvre de quickSort
// appelle cette fonction avec une string, un tableau
// C d'entiers et un std::vector<double>
//
//
// NE RIEN MODIFIER DANS CETTE FONCTION
int main(int argc, const char * argv[]) {
// std::string
string s("EXEMPLE_DE_TRI_RAPIDE");
cout << s << endl;
quickSort(s.begin(), s.end());
cout << s << endl;
// C array
int array[] = {7, 3, 6, 1, 9, 2, 0, 10, 12, -3};
cout << endl;
for (int i : array)
cout << i << " ";
cout << endl;
quickSort(array, array + 10);
for (int i : array)
cout << i << " ";
cout << endl;
// std::vector
vector<double> vd{0.1, 1.2, 3.5, 1.8, 0.4, 10.2, -0.4, 5.8, 6.9, 12.5, 24.3, 0.6, 12.2, 4.5, 3.1415};
cout << endl;
for (double d : vd)
cout << d << " ";
cout << endl;
quickSort(vd.begin(), vd.end());
for (double d : vd)
cout << d << " ";
cout << endl;
return 0;
}