前提:需要有一个用来进行对比的基准
partition函数是将一个数组分成三部分:
左部分:是<基准
中部分:是==基准
右部分:是>基准
left:左部分的右边界
index:中部分右边界的右边
right:右部分的左边界
遍历过程中,左部分和中部分一直是重合的,中部分和右部分的边界在努力的靠近并准备合并。
详细:
当arr[index]<基准时,左部分需要扩充,即:swap(arr,++left,index++);
当arr[index]==基准时,中部分需要扩充,即index直接++;
当arr[index]>基准时,右部分需要扩充,但是因为right左边和index右边为模糊区域(不知道其中的元素和基准的
大小,所以交换后,index不变化)即:swap(arr,index,--right)
初始:left = -1; index = 0;right = len;
代码:
void swap(int arr[],int index1,int index2){
int tmp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = tmp;
}
void partition(int arr[],int len)
{
//假设数组的元素只可能是0,1,2。
int left = -1;
int index = 0;
int right = len;
while(index<right)
{
if(arr[index]==0)
{
swap(arr,++left,index++);
}
else if(arr[index]==2)
{
swap(arr,index,--right);
}
else
{
index++;
}
}
}
本文详细探讨了C++标准库中`std::partition`函数的使用和原理,包括其在排序算法中的作用,如何根据谓词进行元素划分,并通过实例代码展示了如何在实际编程中应用`std::partition`来优化数据处理流程。

1873

被折叠的 条评论
为什么被折叠?



