2.使用模板(泛型)编写算法

2018-02-24  本文已影响0人  村上果树

用模板编写选择排序函数,并分别用整型数组,浮点型数组,字符串型数组,以及自定义结构体Student型数组进行测试

main.cpp:
#include <iostream>
#include "Student.h"

using namespace std;

template<typename T>
void selectionSort(T arr[], int n){

    for(int i = 0 ; i < n ; i ++){

        int minIndex = i;
        for( int j = i + 1 ; j < n ; j ++ )
            if( arr[j] < arr[minIndex] )
                minIndex = j;

        swap( arr[i] , arr[minIndex] );
    }
}

int main() {

    // 测试模板函数,传入整型数组
    int a[10] = {10,9,8,7,6,5,4,3,2,1};
    selectionSort( a , 10 );
    for( int i = 0 ; i < 10 ; i ++ )
        cout<<a[i]<<" ";
    cout<<endl;

    // 测试模板函数,传入浮点数数组
    float b[4] = {4.4,3.3,2.2,1.1};
    selectionSort(b,4);
    for( int i = 0 ; i < 4 ; i ++ )
        cout<<b[i]<<" ";
    cout<<endl;

    // 测试模板函数,传入字符串数组
    string c[4] = {"D","C","B","A"};
    selectionSort(c,4);
    for( int i = 0 ; i < 4 ; i ++ )
        cout<<c[i]<<" ";
    cout<<endl;

    // 测试模板函数,传入自定义结构体Student数组
    Student d[4] = { {"D",90} , {"C",100} , {"B",95} , {"A",95} };
    selectionSort(d,4);
    for( int i = 0 ; i < 4 ; i ++ )
        cout<<d[i];
    cout<<endl;

    return 0;
}
//定义Student类型
temp.h:
#ifndef _TEMP_H
#define _TEMP_H
#include<iostream>
#include<string>
using namespace std;
struct Student{
    string name;
    int score;
//重载<运算符,当分数不同时选小的,当分数相同时,选name的字典序在前的。
    bool operator < (const Student& otherStudent){
        return score != otherStudent.score ? score < otherStudent.score : name < otherStudent.name;
    }
    friend operator << (ostream& os, const Student& student){
        os << "Student: " << student.name << " " << student.score << endl;
    }
};
#endif

运行截图:


另:

当我这样修改后,可以验证选择排序是不稳定的.
Student d[4] = { {"A",95} , {"C",100} , {"B",95} , {"D",90} };

结果是B在A的前面,是不稳定的.

上一篇 下一篇

猜你喜欢

热点阅读