选择排序 Selection Sort
1)在数组中找最小的数与第一个位置上的数交换;
2)找第二小的数与第二个位置上的数交换;
3)以此类推
template<typename T> //泛型
void selectionSort(T arr[], int n){
//数组arr 个数n
for(int i=;i<n;i++){
//寻找[i,n)区间里的最小值
int minIndex = i;
for(int j = i+;j<n;j++){
if(arr[j] < arr[minIndex])
//minIndex 中储存最小元素的下标
minIndex = j;
swap(arr[i], arr[minIndex]);
}
}
}
完整代码:
#include <iostream> #include "Student.h" using namespace std; template<typename T> void selectionSort(T arr[], int n){ for(int i = ; i < n ; i ++){ int minIndex = i; for( int j = i + ; j < n ; j ++ ) if( arr[j] < arr[minIndex] ) minIndex = j; swap( arr[i] , arr[minIndex] ); } } int main() { // 测试模板函数,传入整型数组 int a[] = {,,,,,,,,,}; selectionSort( a , ); for( int i = ; i < ; i ++ ) cout<<a[i]<<" "; cout<<endl; // 测试模板函数,传入浮点数数组 float b[] = {4.4,3.3,2.2,1.1}; selectionSort(b,); for( int i = ; i < ; i ++ ) cout<<b[i]<<" "; cout<<endl; // 测试模板函数,传入字符串数组 string c[] = {"D","C","B","A"}; selectionSort(c,); for( int i = ; i < ; i ++ ) cout<<c[i]<<" "; cout<<endl; // 测试模板函数,传入自定义结构体Student数组 Student d[] = { {"D",} , {"C",} , {"B",} , {"A",} }; selectionSort(d,); for( int i = ; i < ; i ++ ) cout<<d[i]; cout<<endl; return ; }
相应头文件:Student.h
#include <iostream> #include <string> using namespace std; struct Student{ string name; int score; // 重载小于运算法,定义Student之间的比较方式 // 如果分数相等,则按照名字的字母序排序 // 如果分数不等,则分数高的靠前 bool operator<(const Student& otherStudent){ return score != otherStudent.score ? score > otherStudent.score : name < otherStudent.name; } friend ostream& operator<<(ostream &os, const Student &student){ os<<"Student: "<<student.name<<" "<<student.score<<endl; return os; } };