使用三数中指法可以进一步提升快速排序的效率,实现如下:
int median3(int *arr, int left, int right)
{
int center = (left + right) / 2;
if (arr[left] > arr[center]) {
swap(arr[left], arr[center]);
}
if (arr[left] > arr[right]) {
swap(arr[left], arr[right]);
}
if (arr[center] > arr[right]) {
swap(arr[center], arr[right]);
}
swap(arr[center], arr[right - 1]);
return arr[right - 1];
}
void insert_sort(int *arr, int left, int right)
{
int i, j, key;
for (i = left; i <= right; ++i) {
key = arr[i];
for (j = i; j > left && arr[j - 1] > key; --j) {
arr[j] = arr[j - 1];
}
arr[j] = key;
}
}
#define cutoff 3
void qsort(int *arr, int left, int right)
{
if (left + cutoff <= right) {
int pivot = median3(arr, left, right);
int i = left;
int j = right - 1;
for (;;) {
while (arr[++i] < pivot) {
}
while (arr[--j] > pivot) {
}
if (i < j) {
swap(arr[i], arr[j]);
} else {
break;
}
}
swap(arr[i], arr[right - 1]);
qsort(arr, left, i - 1);
qsort(arr, i + 1, right);
} else {
insert_sort(arr, left, right);
}
}