类模板:使用户可以为类声明一种模式,使类中某些数据成员,某些成员函数的参数,某些成员函数的返回值,能取任意类型。
类模板中,类名后必须跟<模板参数标识符列表>
在主程序中定义对象时,类需说明对象是什么类型,同样用<>括号,在<>尖括号中指定所需类模板的类型。
类模板: template<模板参数表>
class 类名
{ 类成员声明}
在类模板以外定义成员函数,都要带上template<模板参数表>,指定成员函数属于哪个类时,模板类名后必须跟<模板参数标识符列表>
赋值与复制构造函数:复制构造函数是在这个对象刚刚诞生的时候就让它和一个已有对象完全一致,
赋值是一个对象已经存在一段时间了,再将另一个对象的值赋给它,也就是说这两个对象曾经是不一样的,曾经各自独立存在的,但现在要让他们的状态,他们的值变一样的。
重载指针转换运算符:对象名不能自动转换成对应的指针地址,它们的类型不相符,不能将对象转换成指针类型,默认情况下,是不能实现的,必须要进行重载。
将Arry类的对象名转换为T类型的指针:
template<class T> Arry<T>::operator T *() {return list}
链表是一种动态数据结构,可以用来表示顺序访问的线性群体。(线性群体是按位置有序排列,可以区分第一个元素,第二个元素)
链表是由系列结点组成的,结点可以在运行时动态生成,每个结点包括数据域和指向链表下一个结点的指针(即下一个结点的地址)
找到每一个结点的唯一方式是通过前驱结点,不能去掉头指针,表头指针不能移动,始终指向表头,链表中有一个游标,用来指向链表中间的其他结点,单链表工作指针有两个,一个指向当前结点,另一个是指向当前结点的前驱结点的指针,两个同时移动,用来在链表中查找数据,删除数据,遍历数据。
插入结点时,必须先将当前结点的后继指针赋值给新结点,倘若直接将新加入结点的地址给当前结点,则原本下一个指针的地址丢失,链表后半部分找不到。
删除结点时,需先判断,所要删除的结点是否为末尾结点,若为末尾结点,则直接删除,什么也不用做,否则将当前结点的next赋值给新的指针,对新的指针进行操作,把新指针的next赋值给当前结点,替换到当前结点原本next中的地址。
直接插入:
外层循环控制总的比较次数,内存循环将当前插入值依次与前面所插入的值进行比较。
从一个集合中,从前往后依次取出元素,首先与末端元素进行比较,若比它小,则先将末端元素往后移动,再和前一个元素进行比较,直到比前一个元素大停止,将该元素插入。
template <class T>
void insertionSort(T a[], int n) {
int i, j;
T temp;
for (int i = 1; i < n; i++) {
int j = i;
T temp = a[i];
while (j > 0 && temp < a[j - 1]) {
a[j] = a[j - 1];
j--;
}
a[j] = temp;
}
}
选择排序:
有一个中间人indexleast,首先将第一个元素的地址赋给它,凭着地址中的值,拿这个值依次往后进行比较,当发现比它小的值时,更改indexleast中的地址,换成这个值更小的地址号,然后用它和拿来比较的数值的地址进行交换,交换后,继续用indexleast地址中的值进行比较。
template <class T>
void mySwap(T &x, T &y) {
T temp = x;
x = y;
y = temp;
}
template <class T>
void selectionSort(T a[], int n) {
for (int i = 0; i < n - 1; i++) {
int leastIndex = i;
for (int j = i + 1; j < n; j++)
if (a[j] < a[leastIndex])
leastIndex = j;
mySwap(a[i], a[leastIndex]);
}
}
起泡排序:
对具有 n 个元素的序列按升序进行起泡排序的步骤:
首先将第一个元素与第二个元素进行比较,若为逆序,则将两元素交换。然后比较
第二、第三个元素,依次类推,直到第n-1和第n个元素进行了比较和交换。此过程称
为第一趟起泡排序。经过第一趟,最大的元素便被交换到第n个位置。
对前n-1个元素进行第二趟起泡排序,将其中最大元素交换到第n-1个位置。
如此继续,直到某一趟排序未发生任何交换时,排序完毕。对n个元素的序列,起
泡排序最多需要进行n-1趟。
#include<iostream>
using namespace std;
template<class T>
void myswap(T &x, T &y)
{
T temp = x;
x = y;
y = temp;
}
template<class T>
void bubblesort(T a[], int n)
{
int i = n - 1;
while (i > 0) //发生交换,还需要进行下一趟
{
int lastexchageindex = 0;//用来控制比较次数
for (int j = 0; j < i; j++)
{
if (a[j + 1] < a[j])
myswap(a[j + 1], a[j]);
lastexchageindex = j; //j始终会比i少1,每次正好沉底一个数
}
i = lastexchageindex;//将比当前次数i少1的值再次赋值给i,用来控制下一次循环所需比较的次数
}
}
int main()
{
int a[6] = { 8, 5, 9, 2, 5 };
bubblesort(a, 6);
for (auto &number : a)
{
cout << number << endl;
}
return 0;
}