看不懂你为什么要用预处理?你的问题就是在52行处交换的时候,要是i==min_pos的话,你执行完14行之后,arr[i]=0,arr[min_pos]=0,这就是i=min_pos的结果,所以应该在交换的前面添加一句,当i!=min_posd的时候才能交换,否则不交换。
if(i!=min_pos){
swap_pos(arr[i], arr[min_pos]); //bug at i=3, min_pos=3 for some reason
}
printArr(arr); cout << "\n";