常用算法

排序算法:

快速排序,采用分治法的思想,分离为n个较小的规模的集合,独立而与原问题相同。

选取序列当中的一个关键字,依次正序找大逆序找小,然后挖坑填入。使得它左边的值都比它小,右边都比它大,这样的关键字称为中枢轴。

typedef struct
{
    int r[MAXSIZE+1]; //存储排序数组,r[0]用作哨兵或temp
    int length;       //记录表长
}SqList;

void QSort(SqList*L,int low,int high)           //对顺序表L中的子序列L->r[low...high]做快速排序
{
    if (low<high)
    {
        // pivot=Partition(L,low,high);         //将L->r[low...high]一分为二,算出枢轴值pivot
        int i = low, j = high;
        L->r[0] = L->r[i];                      //用子表的第一个记录做枢轴记录,存于0,其位置i为坑位
        while (i<j)
        {
            while (i<j && L->r[j] >= L->r[0])   //倒序查找较小值,并填入r[i]
                j--;                            //找到较小值,并记录下一个大坑位置
            if (i<j)
                L->r[i++] = L->r[j];            //将较小值填入小坑位r[i]中,i++右移一位减少一次判断
            while (i<j && L->r[i] <= L->r[0])   //正序查找较大值,并填入r[j]
                i++;                            //找到较大值,并记录下一个小坑位置
            if (i<j)
                L->r[j--] = L->r[i];            //将较大值填入大坑位r[j]中,j--左移一位减少一次判断
        }
        L->r[i] = L->r[0];                      //相对中枢值查找完毕,i=j将中枢值填入坑位
        QSort(L,low,i-1);                       //对低子表递归排序
        QSort(L,i+1,high);                      //对高子表递归排序
    }
}


 //迭代  斐波那契
int Fbi(int i)
{
    if (i<2)
    {
        return i==0 ? 0:1;
    }
    return Fbi(i-1)+Fbi(i-2);
}


LinkList链表,更改链表数据的地方都需要使用指针。

LinkStack链栈,没有附加头结点,运算受限的单链表。

Queue队列,STL内API,push、pop、front、back、empty、size等。

KMP String

二叉树,反应物体之间层次结构。排序二叉树可以进行排序、快速查找;并查集分类;小根堆寻找最小节点。

 //二叉排序树查找
BOOL SearchBST(BitTree T,int key,BitTree f,BitTree*p)//f为T的双亲,初始调用值为NULL//指针p指向该数据结点
{
    if (!T)
    {
        *p=f;
        return FALSE;
    }

    else if (key==T->data)
    {
        *p=T;
        return TRUE;
    }
    else if (key<T->data)
    {
        return SearchBST(T->lchild,key,T,p);
    }
    else
        return SearchBST(T->rchild,key,T,p);
}


算法源码链接cpp_algorithm.cpp

目录:

- 链表LinkList
    - 创建链表,头插法
    - 创建链表,尾插法,利用动态指针
    - 删除链表
    - 链表查找元素
    - 链表指定位置插入元素
    - 删除指定元素
- 链栈LinkStack
    - 初始化栈
    - 清空栈
    - 获取栈顶元素
    - 插入新元素到栈顶
    - 删除栈顶元素
- 迭代,斐波那契
- 循环队列Queue(前段删除,后端插入)
    - 获取队列长度
    - EnQueue
    - DeQueue
- string
    - KMP模式匹配算法
    - 获取子串pos个字符之后的位置
- 二叉树
    - 前序遍历递归算法
    - 中序遍历
    - 尾序遍历
    - 生成二叉树
    - 二叉排序树BST查找
    - BST插入
    - 删除BST元素
    - 删除二叉树BST
    - BST右旋处理
    - BST左旋处理
    - 以T所指结点为根的二叉排序书做左平衡旋转处理
    - 右平衡旋转处理
    - 平衡二叉树AVL插入元素,并平衡旋转
- 二分查找,有序表
- 插值查找,二分法改进,适合数据分布较均匀的数列
- 斐波那契查找,大数据
- 有序查找
    - 元素交换,常用
    - 冒泡排序
    - 冒泡法,反序交换
    - 冒泡法,优化
    - 选择排序,小者与第一位置交换
    - 直插排序,将记录插入到已排序的有序表,得到记录+1的有序表
    - 希尔排序
    - 堆排序,书用于完全二叉树,2^n+1
    - 堆排序,调整
    - 归并排序
    - 非递归的归并排序
    - 将SR中相邻长度为s的子序列两两归并到TR[]
    - 快排
    - 获取枢轴值(左小右大,中心值)
    - 小数组排序优化,>7枢轴快排,<=7直插排序
    - QSort1,快排、小数组直插合并优化
- 图,一维数组存储顶点信息,二维数组存储边或弧的信息
    - 创建无向图
    - 无向图,邻接表的创建
    - 邻接矩阵深度递归算法
    - 邻接矩阵深度遍历
    - 邻接表深度递归算法
    - 邻接表深度遍历
    - 邻接矩阵广度遍历
    - 邻接表广度遍历
    - 最小生成树,普里姆算法prim,查找遍历顶点最短路径,邻接矩阵
    - kruskal克鲁斯卡最小生成树
    - Dijsktra地杰斯特拉算法,最短路径
    - Floyd佛洛依德算法,网图G中各顶点v到其余顶点w最短路径p[v][w]及权长度D[v][w]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值