[0,3,9,8,19,10,6,4,1,7,2,5]
int min_free(int arr[],int n);
#include<stdio.h>
#define SWAP(arr,i,j) {\
unsigned tmp =arr[i];\
arr[i] =arr[j];\
arr[j]=tmp;\
}
unsigned min_free(unsigned arr[], int n);
int main(void) {
unsigned arr[] = {0,3,9,8,19,8,6,4,1,7,2,5};
printf("%u\n",min_free(arr, 12));
return 0;
}
unsigned min_free(unsigned arr[], int n) {
int low = 0;
int high = n - 1;
while (low<=high) {
int mid = low + (high - low >> 1);
int l = low;
for (int r = low; r < high + 1; ++r) {
if (arr[r] <= mid) {
SWAP(arr, l, r);
++l;
}
}
if (l == mid + 1) {
low = 1;
}
else {
high = l - 1;
}
}
return low;
}