C++ 简单选择排序函数的两种函数模板

  这里只讨论利用函数模板对数组的元素进行从小到大的排序,首先是视频教程里的函数模板头文件header_9_12.h:

#ifndef HEADER_9_12_H
#define HEADER_9_12_H

//辅助函数:交换x和y的值
template 
void mySwap(T &x, T &y) {
    T temp = x;
    x = y;
    y = temp;
}

//用选择法对数组a的n个元素进行排序
template 
void selectionSort(T a[], int n) {
    for (int i = 0; i < n - 1; i++) {
        int leastIndex = i; //最小元素之下标初值设为i
        for (int j = i + 1; j < n; j++) //在元素a[i + 1]..a[n - 1]中逐个比较显出最小值
        if (a[j] < a[leastIndex])   //smallIndex始终记录当前找到的最小值的下标
            leastIndex = j;
        mySwap(a[i], a[leastIndex]);    //将这一趟找到的最小元素与a[i]交换
    }
}
#endif  //HEADER_9_12_H

  主函数就简单定义一个一维数组a[10]:

#include 
#include "Header_9_12.h"
//#include "header_2.h"
using namespace std;

int main(){
    int a[10] = { 31, 5, 13, 8, 12, 5, 23, 4, 6, 10 };
    selectionSort (a, 10);
    for (int i = 0; i < 10; i++){
        cout << a[i] << endl;
    }
    return 0;
}

  主函数可以实现,但是笔者觉得头文件代码还有简化的空间,于是再定义一个简化的函数模板头文件header_2.h:

#ifndef HEADER_2_H
#define HEADER_2_H

//用选择法对数组a的n个元素进行排序
template 
void selectionSort(T a[], int n) {
    int temp = 0;
    for (int i = 0; i < n - 1; i++){
        for (int j = i + 1; j < n; j++){
            if (a[j] < a[i]){
                temp = a[j];
                a[j] = a[i];
                a[i] = temp;
            }
        }
    }
}
#endif  //HEADER_2_H

  之后在主函数头包含头文件"header_2.h",隐藏头文件"Header_9_12.h",成功运行。

总结:
  虽然改进后的头文件代码比原先的头文件代码要少,但其实仅仅是把独立出来的交换函数mySwap的函数体放回到了selectionSort函数体中,对于编译器来说,这两个头文件执行的效率其实是一样的。

  如果一个函数体中要进行很多的元素之间的值交换,那么就需要把交换的代码独立出来写一个交换函数。这样的话,原先函数的函数体代码就会更加简洁美观(对于编译器来说执行效率是没差的)。

你可能感兴趣的:(C++ 简单选择排序函数的两种函数模板)