@@ -185,4 +185,78 @@ static PyObject* insertion_sort(PyObject* self, PyObject* args, PyObject* kwds)
185
185
}
186
186
187
187
188
+ static PyObject* cocktail_shaker_sort_impl (PyObject* array, size_t lower, size_t upper, PyObject* comp) {
189
+ bool is_sorted = false ;
190
+
191
+ while (!is_sorted){
192
+ is_sorted = true ;
193
+
194
+ for (size_t i = lower; i < upper; i++){
195
+ PyObject* i_PyObject = PyLong_FromSize_t (i);
196
+ PyObject* i1_PyObject = PyLong_FromSize_t (i+1 );
197
+ if (_comp (PyObject_GetItem (array, i_PyObject), PyObject_GetItem (array, i1_PyObject), comp) != 1 ){
198
+ PyObject* tmp = PyObject_GetItem (array, i1_PyObject);
199
+ PyObject_SetItem (array, i1_PyObject, PyObject_GetItem (array, i_PyObject));
200
+ PyObject_SetItem (array, i_PyObject, tmp);
201
+ is_sorted = false ;
202
+ }
203
+ }
204
+
205
+ for (size_t i = upper - 1 ; i > lower; i--) {
206
+ PyObject* i_PyObject = PyLong_FromSize_t (i);
207
+ PyObject* i1_PyObject = PyLong_FromSize_t (i - 1 );
208
+ if (_comp (PyObject_GetItem (array, i1_PyObject), PyObject_GetItem (array, i_PyObject), comp) != 1 ) {
209
+ PyObject* tmp = PyObject_GetItem (array, i1_PyObject);
210
+ PyObject_SetItem (array, i1_PyObject, PyObject_GetItem (array, i_PyObject));
211
+ PyObject_SetItem (array, i_PyObject, tmp);
212
+ is_sorted = false ;
213
+ }
214
+ }
215
+ }
216
+ return array;
217
+ }
218
+
219
+ static PyObject* cocktail_shaker_sort (PyObject* self, PyObject* args, PyObject* kwds) {
220
+ PyObject *args0 = NULL , *start = NULL , *end = NULL ;
221
+ PyObject *comp = NULL ;
222
+ size_t lower, upper;
223
+
224
+ args0 = PyObject_GetItem (args, PyZero);
225
+ int is_DynamicOneDimensionalArray = _check_type (args0, &DynamicOneDimensionalArrayType);
226
+ int is_OneDimensionalArray = _check_type (args0, &OneDimensionalArrayType);
227
+ if (!is_DynamicOneDimensionalArray && !is_OneDimensionalArray) {
228
+ raise_exception_if_not_array (args0);
229
+ return NULL ;
230
+ }
231
+
232
+ comp = PyObject_GetItem (kwds, PyUnicode_FromString (" comp" ));
233
+ if (comp == NULL ) {
234
+ PyErr_Clear ();
235
+ }
236
+
237
+ start = PyObject_GetItem (kwds, PyUnicode_FromString (" start" ));
238
+ if (start == NULL ) {
239
+ PyErr_Clear ();
240
+ lower = 0 ;
241
+ } else {
242
+ lower = PyLong_AsSize_t (start);
243
+ }
244
+
245
+ end = PyObject_GetItem (kwds, PyUnicode_FromString (" end" ));
246
+ if (end == NULL ) {
247
+ PyErr_Clear ();
248
+ upper = PyObject_Length (args0) - 1 ;
249
+ } else {
250
+ upper = PyLong_AsSize_t (end);
251
+ }
252
+
253
+ args0 = cocktail_shaker_sort_impl (args0, lower, upper, comp);
254
+ if (is_DynamicOneDimensionalArray) {
255
+ PyObject_CallMethod (args0, " _modify" , " O" , Py_True);
256
+ }
257
+
258
+ Py_INCREF (args0);
259
+ return args0;
260
+ }
261
+
188
262
#endif
0 commit comments