Когда программа добирается до последнего элемента (который при этом, естественно, оказывается самым большим), происходит следующее:
for (i = 0; i < vec.size(); i++){
int imin = 0;
for (int j = i; j < vec.size(); j++){
if (vec[j] < vec[imin]){ imin = j; }
}
int temp = vec[i];
vec[i] = vec[imin];
vec[imin] = temp;
}
Внутри внешнего цикла
imin обнуляется, во внутреннем цикле ничего не происходит, в результате последний элемент в конце внешнего цикла переставляется с нулевым.