选择排序
实现思想:在一组无序的数列中,选择一个数为基数,第一个数就好,其他数和它比较,记下比它小的数的下标,这个比它小的数继续和后面的数比较,找出比它小的数的下标,一轮下来就可以找到最小的数,把这个最小的数放在第一个位置,下一轮从第二个数开始比较,找到第二个数开始后面的最小数放在第二个位置…
算法容易理解和实现,下面代码可以更多的关注到使用模板类型的使用上,以及自定义类型的排序上(重载操作符operator)。
#include <iostream>
using namespace std;
/**
* 选择排序
* @return
*/
template<typename T> //模板类型
void selectionSort( T arr[] ,int n ){
for (int i = 0; i < n; ++i) {
//寻找[i,n]区间里最小值
int minIndex = i;
for (int j = i+1; j < n; ++j) {
if (arr[j] < arr[minIndex]){
minIndex = j;
}
}
swap(arr[i],arr[minIndex]);
}
}
struct Student{
string name;
int score;
bool operator<(const Student &otherStudent){
//从小到大排序
//return score < otherStudent.score;
//从大到小排序
//return score > otherStudent.score;
//从大到小排序,如果相等,则比较name,小的靠前
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;
}
};
int main() {
//整型
int arr[9] = {4,6,8,9,5,7,3,2,1};
selectionSort(arr,9);
for (int i = 0; i < 9; ++i) {
cout<< arr[i] <<" ";
}
cout << endl;
//浮点型
float arr2[6] = {1.6,2.7,1.2,2.3,6.7,5.8};
selectionSort(arr2,6);
for (int i = 0; i < 6; ++i) {
cout<< arr2[i] <<" ";
}
cout << endl;
//字符串型
string str[4] = {"D","C","B","A"};
selectionSort(str,4);
for (int i = 0; i < 4; ++i) {
cout<< str[i] <<" ";
}
cout<<endl;
//自定义类型
Student s[4] = {{"A",90},{"B",100},{"C",95},{"D",95}};
selectionSort(s,4);
for (int i = 0; i < 4; ++i) {
cout<<s[i];
}
cout<<endl;
return 0;
}
附上Java实现代码:【算法】冒泡排序 选择排序 插入排序