一 . 这里先给大家回顾一些在C++里面的知识点:
1.模板 : 类似于石膏娃娃一样,大致的模型都已经塑造好的,顾客只需要更具自己的爱好在相应的地方涂上喜欢的颜色即可.
2.通过模板 , 进入泛型编程,那什么是泛型编程呢? 泛型编程 : 是指一个函数或一个类的数据类型是广泛的.
3.函数模板
a.关键字 : template class/typename
b.格式 :
(1) template<class/template 标识符> 函数返回值 函数名 (函数的参数列表) //将函数声明为一个模板
(2) template<class/template 标识符1,class/template 标识符2, ...> 函数返回值 函数名 (函数参数列表) //将函数声明为一个模板
c. 例如
template<class T> void function(T a,T b) { } //function函数被声明为一个模板
template<class T> void function(T1 a,T2 b) { } //function 函数被声明为一个模板
4.函数模板的使用说明
(1)关键字template用于声明一个模板(模板函数和模板类);
(2)<class T> 中的T表示模板的类型形参,模板类型形参可以用class或者typename声明,模板形参可根据实际需要进行增删;
(3)函数的返回值,可以是基本的数据类型(void,int, ...),也可以是类类型,也可以是模板形参类型;
(4)函数的参数列表内的(T a ,T b),表示函数的形参,形参的类型可以实模板形参类型,也可以是基本的数据类型,还可以是类类型;
(5)模板形参中的 “T” 就表示泛型,泛型是指可以是int\char\float ...;
(6)函数模板可以发生重载;
(7)模板形参要与函数形参一一对应(对于隐式调用而言),显式调用可以不用一一对应;
5.函数模板的调用
(1)隐式调用
隐式调用类似于普通函数的调用(与普通函数调用一致)
函数名(实参1,实参2,....)
(2)显示调用
格式:
函数名<实参数据类型>(实参1,实参2,.......)
6.快速排序
步骤流程:
(1)从待排序的列表中取出一个数据,作为基准数据,一般使用列表中第一个数据作为基准数据;
(2)创建两个指针(非彼指针),一个指针(i)指向列表中的第一个数据元素,另外一个指针(j)指向列表中的最后一个数据元素;
(3)让指向列表尾部数据的指针(j)向后走,直到遇到比基准数据小的数据,这时候尾指针(j)就停下;
让指向列表头部数据的指针(i)向前走,直到遇到比基准数据大的数据,这时候头指针(i)就停下;
如果i和j没有相遇,则让头指针i指向的数据和尾指针j指向的数据进行交换;
继续执行第3步;
如果i和j相遇了,这时候,就让i或者j指向的数据与基准数据进行交换;
(4)重复执行第1、2、3步,直到整个列表排序完成;
二 . 例题:编写如下形式的模板: template<class Type>void sort(Type* A, int n, bool f)
对一个具有n个Type类型的一维数组进行排序,f为1表示从小到大排序,f为0表示从大到小排序
//编写如下形式的模板: template<class Type>void sort(Type* A, int n, bool f)
//对一个具有n个Type类型的一维数组进行排序,f为1表示从小到大排序,f为0表示从大到小排序
#include<iostream>
#include<cstdlib>
using namespace std;
// 快速排序算法
template<typename T>void QuickSort(T arr[], int left, int right, bool f)
{
if (left >= right)return; //排除数组中只有一个数据的情况
T key = arr[left]; //设置一个基准点(一般是用数组的第一个数据)
int i = left + 1;
int j = right;
while (true)
{
if (f)
{
while (arr[i] < key)
{
if (i == right)break; //向前(右)移
i++;
}
while (arr[j] > key) //向后(左)移
{
if (j == left)break;
j--;
}
}
else
{
while (arr[i] > key)
{
if (i == right)break;
i++;
}
while (arr[j] < key)
{
if (j == left)break;
j--;
}
}
if (j <= i)break;
//交换i和j指向的数据
T temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//交换基准数据
T temp = arr[j];
arr[j] = arr[left];
arr[left] = temp;
QuickSort(arr, left, j - 1, f);
QuickSort(arr, j + 1, right, f);
}
// 编写Sort函数,传参进快速排序
template<typename T>void Sort(T* A, int n, bool f)
{
QuickSort(A, 0, n - 1, f);
}
// 数组内数据输出到控制台(显示器)
template<typename T>void Display(T* A, int n)
{
for (int i = 0; i < n; i++)
cout << A[i] << " ";
cout << endl;
}
int main()
{
int a[10];
for (int i = 0; i < 10; i++)
cin >> a[i];
cout << "排序前 :" << endl;
Display<int>(a, 10);
cout << "排序后 :" << endl;
Sort<int>(a, 10, 0);
Display<int>(a, 10);
Sort<int>(a, 10, 1);
Display<int>(a, 10);
cout << endl << endl;
}
运行结果为: