1、思路:对于当前第一个数,假定它是最小的,遍历后面的数,发现比当前数还小的,进行交换,这样就保证了当前第一个为最小的。
2、代码:
1 template <typename T> 2 void SelectSort(vector<T>& vec) 3 { 4 for(int i=0; i< vec.size();i++) 5 { 6 T min = vec[i]; 7 for(int j=i+1;j < vec.size();j++) 8 { 9 if(vec[j]<min) 10 { 11 min = vec[j]; 12 vec[j] = vec[i]; 13 vec[i] = min; 14 } 15 } 16 } 17 }
3、上述代码,存在问题:交换上来的元素还可能不是最小的,会导致多次交换。解决办法是,发现更小的之后,不交换,而是记录最小的下标,最后找到最小的下标,然后交换。代码:
1 template <typename T> 2 void SelectSort_2(vector<T>& vec) 3 { 4 for(int i=0; i< vec.size();i++) 5 { 6 int index_Min = i; 7 for(int j=i+1;j < vec.size();j++) 8 { 9 if(vec[j]<vec[index_Min]) 10 { 11 index_Min = j; 12 } 13 } 14 15 if(index_Min != i) 16 { 17 swap(vec,i,index_Min); 18 } 19 } 20 }