这里只讨论利用函数模板对数组的元素进行从小到大的排序,首先是视频教程里的函数模板头文件header_9_12.h:
#ifndef HEADER_9_12_H
#define HEADER_9_12_H
//辅助函数:交换x和y的值
template <class T>
void mySwap(T &x, T &y) {
T temp = x;
x = y;
y = temp;
}
//用选择法对数组a的n个元素进行排序
template <class T>
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 <iostream>
#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<int> (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 <class T>
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函数体中,对于编译器来说,这两个头文件执行的效率其实是一样的。
如果一个函数体中要进行很多的元素之间的值交换,那么就需要把交换的代码独立出来写一个交换函数。这样的话,原先函数的函数体代码就会更加简洁美观(对于编译器来说执行效率是没差的)。