#include <stdio.h>
#include <stdlib.h>
// 交换两个元素
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 三数取中选择基准元素
int medianOfThree(int arr[], int left, int right) {
int mid = left + (right - left) / 2;
if ((arr[left] <= arr[mid] && arr[mid] <= arr[right]) ||
(arr[right] <= arr[mid] && arr[mid] <= arr[left]))
return mid;
else if ((arr[mid] <= arr[left] && arr[left] <= arr[right]) ||
(arr[right] <= arr[left] && arr[left] <= arr[mid]))
return left;
else
return right;
}
// 分区函数,处理重复元素
int partition(int arr[], int left, int right) {
int pivotIndex = medianOfThree(arr, left, right);
swap(&arr[pivotIndex], &arr[right]);
int pivot = arr[right];
int i = left - 1;
int j = right;
for (;;) {
while (arr[++i] < pivot);
while (arr[--j] > pivot && j > left);
if (i >= j) break;
swap(&arr[i], &arr[j]);
}
swap(&arr[i], &arr[right]);
return i;
}
// 优化的快速排序
void optimizedQuickSort(int arr[], int left, int right) {
if (left < right) {
int pivotIndex = partition(arr, left, right);
optimizedQuickSort(arr, left, pivotIndex - 1);
optimizedQuickSort(arr, pivotIndex + 1, right);
}
}
int main() {
int arr[] = {3, 6, 8, 10, 1, 2, 1};
int n = sizeof(arr) / sizeof(arr[0]);
optimizedQuickSort(arr, 0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}