C++算法库中的partition(first, last, p)函数可以将数组进行划分排序,first为起始位置,last为数组末尾后一个,p为一元谓词。重排序范围 [first, last)
中的元素,使得谓词 p
对其返回 true 的元素前于谓词 p
对其返回 false 的元素。不保持相对顺序。
template<typename ForwardIt>
void quick_sort(ForwardIt first, Forward last)
{
if(first == last)
{
return;
}
auto pivot = *next(first, distance(first,last)/2); //获取中间位置
//先将小于中间位置的元素放到左边并获取前半排序后一个的迭代器位置
ForwardIt middle1 = partition(first, last
, [pivot](const auto& em){ return em < pivot; });
//需要把后半段与中间位置相等的元素放到前面
ForwardIt middle2 = partition(middle1, last
, [pivot](const auto& em){ return pivot == em; });
quicksort(first, middle1);
quicksort(middle2, last);
}