【算法】选择排序 C++

选择排序

实现思想:在一组无序的数列中,选择一个数为基数,第一个数就好,其他数和它比较,记下比它小的数的下标,这个比它小的数继续和后面的数比较,找出比它小的数的下标,一轮下来就可以找到最小的数,把这个最小的数放在第一个位置,下一轮从第二个数开始比较,找到第二个数开始后面的最小数放在第二个位置…

算法容易理解和实现,下面代码可以更多的关注到使用模板类型的使用上,以及自定义类型的排序上(重载操作符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实现代码:【算法】冒泡排序 选择排序 插入排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值