类模板,链表,直接插入排序,选择排序,起泡排序

类模板:使用户可以为类声明一种模式,使类中某些数据成员,某些成员函数的参数,某些成员函数的返回值,能取任意类型。

类模板中,类名后必须跟<模板参数标识符列表>

在主程序中定义对象时,类需说明对象是什么类型,同样用<>括号,在<>尖括号中指定所需类模板的类型。

类模板: 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;
}

原文地址:https://www.cnblogs.com/ymd12103410/p/9597181.html

时间: 2024-08-24 18:47:21

类模板,链表,直接插入排序,选择排序,起泡排序的相关文章

排序 起泡排序(bubble sort),归并排序(merge sort)

1,起泡排序(bubble sort),大致有三种算法 基本版,全扫描. 提前终止版,如果发现前区里没有发生交换,就说明前区已经有序了,直接终止了.但是有个效率低下的地方,就是右边界hi是每次循环向前移动一个单元 跳跃版,在提前终止版的基础上,解决右边界hi移动效率低下的问题.解决思路:每次循环后,记录下最后一次的交换位置A,然后让hi=交换位置A,所以hi就可以跳跃移动多个单元了. 基本版代码实现 //冒泡排序(基本版 效率低下) template<typename T> void Vect

10-6-起泡排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第10章  内部排序 - 起泡排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceListType.c        相关测试数据下载  链接?

C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序

以下列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序,然后是測试的样例.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <

C++学习笔记47:链表的概念与结点类模板

学堂在线学习笔记 链表的概念与结点类模板 顺序访问的线性群体--链表类 链表是一种动态数据结构,可以用来表示顺序访问的线性群体: 链表是由系列结点组成,结点可以在运行时动态生成: 每一个结点包括数据域和指向链表中下一个结点的指针(即下一个结点的地址).如链表中每个结点中只有一个指向后继结点的指针,则该链表称为单链表: 单链表的结点类模板 template <class T> void Node<T>::insertAfter(Node<T> *p) { //p结点指针域

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s

单链表的结点类模板

C++语言程序设计进阶 (2015年秋) 郑莉教授 http://www.xuetangx.com/courses?org=-1&cid=117&page_type=0&page=2 单链表 //单链表的结点类模板 template <class T> class Node{ private: Node<T> *next;//后继结点的指针 public: T data; Node(const T& item,Node<T>*next =

7、群体类和群体数据的组织-1.函数模板和类模板

基本数据类型是c++编译系统预定义的,而自定义类型的数据是由多个基本类型或自定义类型的元素组成的,我们称之为群体数据. 对于群体数据,仅有系统预定义的操作是不够的,在很多情况下,还需要设计与某些具体问题相关的特殊操作,并按照面向对象的方法将数据与操作封装起来,这就是群体类. 群体可以分为两种:线性群体和非线性群体.线性群体中的元素按位置排列有序.非线性群体不用位置顺序来标识元素. 关于群体数据的组织是属于数据结构的范畴,这里只介绍两类常用的算法:排序和查找方法. 排序:又称为分类或整理,是将一个

C++提高1 【泛型编程】函数模板 类模板

[本文谢绝转载] [泛型编程] 函数模板 为什么会有函数模板 现象: 函数的业务逻辑一样 函数的参数类型不一样 [最常用]函数模板  显式的调用 [不常用]类型推导 多个参数,参数定义了必须要用 函数模板,实现int类型数组,char字符串排序: 函数模板 与 普通函数的本质区别 函数模板 和 普通函数在一起 的调用型研究: C++是如何支持函数模板机制的? 函数模板机制结论 类模板 类模板的定义 类模板做函数的参数 类模板的派生成普通类 模板类的派生成模板类 复数类,所有函数都写在类的内部,运

C++STL - 类模板

类的成员变量,成员函数,成员类型,以及基类中如果包含参数化的类型,那么该类就是一个类模板 1.定义 template<typename 类型形参1, typename 类型形参2,...> class 类模板名[:基类]{ 成员变量 成员函数 成员类型 }; 2.使用 类模板名<类型实参1,类型实参2,...> 对象; 类模板名<类型实参1,类型实参2,...> &引用 = 对象; 类模板名<类型实参1,类型实参2,...> *指针 = &对