52 lines
1.1 KiB
C
52 lines
1.1 KiB
C
#include "quicksort.h"
|
|
|
|
void quicksort(double * array, int length) {
|
|
int head, si = 0, ei = length - 1;
|
|
double temp;
|
|
|
|
srand(time(NULL));
|
|
head = rand() % length;
|
|
|
|
do {
|
|
while (array[si] < array[head]) ++si;
|
|
while (array[ei] > array[head]) --ei;
|
|
|
|
if (si < ei) {
|
|
temp = array[si];
|
|
array[si] = array[ei];
|
|
array[ei] = temp;
|
|
|
|
if (si == head || ei == head) head = si == head ? ei++ : si--;
|
|
++si, --ei;
|
|
}
|
|
} while (si < ei);
|
|
|
|
if (si > 1) {
|
|
if (si < 7) bubble(array, si);
|
|
else quicksort(array, si);
|
|
}
|
|
if (ei < length - 2) {
|
|
if (si < 7) bubble(&array[head + 1], length - ei - 1);
|
|
else quicksort(&array[head + 1], length - ei - 1);
|
|
}
|
|
}
|
|
|
|
void bubble(double *arr, int length) {
|
|
double temp;
|
|
bool swapped;
|
|
|
|
for (int i = 0; i < length; ++i) {
|
|
swapped = false;
|
|
|
|
for (int j = 0; j < length - i - 1; ++j) {
|
|
if (arr[j] > arr[j + 1]) {
|
|
swapped = true;
|
|
temp = arr[j];
|
|
arr[j] = arr[j + 1];
|
|
arr[j + 1] = temp;
|
|
}
|
|
}
|
|
|
|
if (!swapped) break;
|
|
}
|
|
}
|