https://blog.csdn.net/k_koris/article/details/80585979
二路快排+三数取中(解决序列有序性比较高的问题)
#include <iostream>
using namespace std;
template<typename T>
void Select_Mid(T nums[], int left, int right)
{
if (left < right)
{
int mid = (left + ((right - left)>>1));
if (nums[mid] > nums[right])
swap(nums[mid], nums[right]);
if (nums[left] > nums[right])
swap(nums[left], nums[right]);
if (nums[left] > nums[mid])
swap(nums[left], nums[mid]);
}
return;
}
template<typename T>
int Partion(T nums[], int left, int right)
{
Select_Mid(nums, left, right);
//swap(nums[rand() % (right - left + 1) + left], nums[left]);
T temp = nums[left];
while (left<right)
{
while (nums[right] >= temp&& left < right) right--;
nums[left] = nums[right];
while (nums[left] <= temp && left < right) left++;
nums[right] = nums[left];
}
nums[left] = temp;
return left;
}
template<typename T>
void QuickSort(T nums[], int left, int right)
{
if (left < right)
{
int pos = Partion(nums, left, right);
QuickSort(nums, left, pos - 1);
QuickSort(nums, pos + 1, right);
}
return ;
}
三路快排+三数取中(解决数组中重复的数字比较多的问题):
template<typename T>
void Select_Mid(T nums[], int left, int right)
{
if (left < right)
{
int mid = (left + ((right - left) >> 1));
if (nums[mid] > nums[right])
swap(nums[mid], nums[right]);
if (nums[left] > nums[right])
swap(nums[left], nums[right]);
if (nums[left] > nums[mid])
swap(nums[left], nums[mid]);
}
return;
}
template<typename T>
void __quicksort3(T arr[], int l, int r)
{
if (l >= r)
return;
Select_Mid(arr, l, r);
T v = arr[l];
int lt = l;//nums[l+1,.....lt]<v;
int gt = r + 1;//nums[gt,.....,r]>v;
int i = l + 1;//arr[lt+1,....,i)==v;
while (i < gt)
{
if (arr[i] < v)
{
swap(arr[i], arr[lt + 1]);
lt++;
i++;
}
else if (arr[i] > v)
{
swap(arr[i], arr[gt - 1]);
gt--;
}
else
{
i++;
}
}
swap(arr[l], arr[lt]);
__quicksort3(arr, l, lt - 1);
__quicksort3(arr, gt, r);
}