This is a very interesting question! I like it!
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
/*
Given an array of n objects with K difference colors. sort them so that objects
of the same color are adjacent, with the colors in the order 1, 2, ... k
Note:
You are not suppose to use the library's sort function for this problem.
Exmaple:
Given colors = [3, 2, 2, 1, 4], k = 4, you code should sort colors in-place to
[1, 2, 2, 3, 4];
*/
void sortColorsII(vector<int>& colors, int k) {
int start = 0;
int end = colors.size() - 1;
int count = 0;
while(count < k) {
int currMin = INT_MAX;
int currMax = INT_MIN;
for(int i = start; i <= end; ++i) {
currMin = min(currMin, colors[i]);
currMax = max(currMax, colors[i]);
}
int left = start;
int right = end;
int curr = left;
while(curr <= right) {
if(colors[curr] == currMin) {
swap(colors[curr], colors[left]);
curr++;
left++;
} else if(colors[curr] > currMin && colors[curr] < currMax) {
curr++;
} else {
swap(colors[curr], colors[right]);
right--;
}
}
count += 2;
start = left;
end = right;
}
}
int main(void) {
vector<int> colors {3, 2, 2, 1, 4};
sortColorsII(colors, 4);
for(int i = 0; i < colors.size(); ++i) cout << colors[i] << endl;
}