Leetcode, SortColors
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
void printArr(int arr[], int n)
{
for (int i = 0; i < n; ++i )
{
cout << arr[i] << " ";
}
cout << endl;
}
//双指针 时间复杂度O(n),空间复杂度O(1)
void solution(int arr[], int n)
{
int red = 0, blue = n - 1;
//紧凑数据,将元素放置到对应位置
for ( int i = 0; i < blue + 1; )
{
if (arr[i] == 0)
swap(arr[i++], arr[red++]);
else if (arr[i] == 2)
swap(arr[i], arr[blue--]);
else
i++;
}
}
//count sort 需要两遍循环 时间复杂度O(n),空间复杂度O(1)
void solution2(int arr[], int n)
{
int counts[3] = {0};
for (int i = 0; i < n; ++i)
counts[arr[i]]++;
int index = 0;
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < counts[i]; ++j)
{
arr[index++] = i;
}
}
}
//partition 时间复杂度O(n),空间复杂度O(1)
void solution3(int arr[], int n)
{
partition(partition(arr, arr + n, bind1st(equal_to<int>(), 0)),
arr + n,
bind1st(equal_to<int>(), 1));
}
//自定义partition 时间复杂度O(n),空间复杂度O(1)
template <typename ForwardIter, typename UnaryPred>
ForwardIter myPartition(ForwardIter first, ForwardIter last, UnaryPred pred)
{
auto pos = first;
for ( ; first != last; ++first )
{
if (pred(*first))
swap(*first, *pos++);
}
return pos;
}
void solution4(int arr[], int n)
{
myPartition(myPartition(arr, arr + n, bind1st(equal_to<int>(), 0)),
arr + n,
bind1st(equal_to<int>(), 1));
}
int main()
{
{
int arr[] = {2,0,2,1,1,0};
solution4(arr, 6); //0 0 1 1 2 2
printArr(arr, 6);
}
{
int arr[] = { 2,0,1 };
solution4(arr, 3); //0 1 2
printArr(arr, 3);
}
{
int arr[] = { 0 };
solution4(arr, 1); //0
printArr(arr, 1);
}
{
int arr[] = { 1 };
solution4(arr, 1); //1
printArr(arr, 1);
}
return 0;
}