Когда программа добирается до последнего элемента (который при этом, естественно, оказывается самым большим), происходит следующее:
        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 обнуляется, во внутреннем цикле ничего не происходит, в результате последний элемент в конце внешнего цикла переставляется с нулевым.