近乎有序与大量重复情况的优化,避免形成o(n^2)
#include<iostream>
#include<algorithm>
using namespace std;
//快排最坏(比如近乎有序时(想原理图)会退化为n^2,故取随机值造成无序)
template<typename T>
void partition(T arr[],int l,int r)
{
swap(arr[l],arr[rand()%(r-l+1)+l];//l~r左闭右闭随机取值,高概率复杂度低 随机化快排
T v=arr[l]; //仍然是开头的位置,只不过不是高度有序性的开头那个了
int j=l;
for(int k=l+1;k<=r;k++)
{
if(arr[i]<v)
{
swap(arr[j+1],arr[i]);
j++;
}
}
swap(arr[l],arr[j]);
return j;
}
//双路快排主要是避免重复值造成的n^2
template<typename T>
void partition(T arr[],int l,int r)
{
swap(arr[l],arr[rand()%(r-l+1)+l];
T v=arr[l];
int i=l+1;j=r;
while(true)
{
while(i <= r && v > arr[i] ) i++;
while(r >= l + 1 && v < arr[j]) j--;
if(i > j) break;//j--后所处的位置还未判断,但是i可以,并且还i++
swap(arr[i],arr[j]);
i++;
j--;
}
swap(arr[l],arr[i]);
return i;
}
template<typename T>
void __quickSort(T arr[],int l,int r)
{
// if(l>=r)
// return;
if(r-l<=15)
{
insertionSort(arr,l,r); //已写好的插入排序优化
return;
}
int p=partition(arr,l,r)
__quickSort(l,p-1);
__quickSort(p+1,r);
}
template<typename T>
void partition(T arr[],int l,int r)
{
T v=arr[l];
int j=l
for(int i=l+1;i<=r;i++)
{
if(arr[i]<v)
{
swap(arr[j+1],arr[i]);
j++;
}
}
swap(arr[j],v);
return j;
}
template<typename T>
void __quicksort(T arr[],int l,int r)
{
if(l>=r)
return;
int p=partition(arr,l,r);
__quicksort(l,p-1);
__quicksort(p+1,r);
}
template<typename T>
void quickSort(T arr[],int n)
{
__quickSort(0,n-1);
}