请写出经过改进的快速排序的算法。c++代码
时间: 2024-03-19 14:46:20 浏览: 52
经过改进的快速排序算法是基于传统快速排序的算法,但是它使用了三数取中法来选择枢轴元素,同时使用插入排序来排序小数组。下面是经过改进的快速排序的C++实现代码:
```c++
#include <iostream>
#include <algorithm>
using namespace std;
const int INSERTION_SORT_THRESHOLD = 10;
void insertionSort(int arr[], int left, int right) {
for (int i = left + 1; i <= right; i++) {
int key = arr[i];
int j = i - 1;
while (j >= left && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
int medianOfThree(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 quickSort(int arr[], int left, int right) {
if (right - left < INSERTION_SORT_THRESHOLD) {
insertionSort(arr, left, right);
}
else {
int pivot = medianOfThree(arr, left, right);
int i = left;
int j = right - 1;
while (true) {
while (arr[++i] < pivot);
while (arr[--j] > pivot);
if (i < j) {
swap(arr[i], arr[j]);
}
else {
break;
}
}
swap(arr[i], arr[right - 1]);
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
}
int main() {
int arr[] = { 12, 11, 13, 5, 6, 7 };
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1);
cout << "Sorted array is \n";
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
}
```
在这个程序中,我们使用了一个常量`INSERTION_SORT_THRESHOLD`来定义插入排序的阈值。当子数组的大小小于该阈值时,我们使用插入排序对其进行排序。当子数组的大小大于该阈值时,我们使用三数取中法来选择枢轴元素,并使用传统快速排序的方法对子数组进行排序。
阅读全文