![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 65
kai_ITthinker
这个作者很懒,什么都没留下…
展开
-
快排算法(递归/非递归)
最近看了一篇文章,介绍递归转非递归的方法,主要是通过stack的数据结构模拟递归函数堆栈的层次调用(后进先出,最里层-->最外层,层层弹出),排序算法很多是通过递归来实现的,这里照葫芦画瓢,实现一下非递归的快排算法。先附上快排的递归用法,用于对比/* 快速排序:从数组中选出一个值flag,通过一轮比较,将比flag大的置于一侧,比flag小的置于另一侧,再依照此法,对这两部分做同样的比较原创 2017-03-02 15:26:35 · 1755 阅读 · 0 评论 -
KMP算法代码实现
KMP算法,看了好久,才写出代码,理解起来有点难度,后来在捋顺了关系后,再回顾就没有之前那样困难了KMP算法的关键在于求next,而next的计算则在于前缀字符串的计算,将问题分解,先求出f(最大前缀字符串),之后再求nextKMP是一个单模匹配算法,时间复杂度为O(m),其中m是带搜索目标串的长度。写出KMP算法代码,主要参考了2篇文章,在本处附上:https://w原创 2017-03-30 17:46:24 · 743 阅读 · 0 评论 -
归并排序
//复杂度O(nlogn),需要辅助空间#include#includevoid merge(std::vector& src, std::vector& dst, int start, int mid, int end){ int k = start; int i = start; int j = mid + 1; for (; (j <= end) && (i <= mid);原创 2017-03-30 17:22:51 · 247 阅读 · 0 评论 -
快排改进(快排+插入)
/* 快排改进算法 快排+插入,当集合较小时,不再排序,由于已经通过快排,保证基本有序,移动次数不会太多,此时改用插入排序, */static void quickSortSection(std::vector& vec, int start, int end, int k) { if ((end - start) > k) { if (start >= end)原创 2017-03-21 11:31:16 · 629 阅读 · 0 评论 -
插入排序
/* 插入排序, 复杂度O(n^2),在基本有序时,效率较高,倒序时最差 原理:将元素一个个插入已经排好序的队列中 */ static void insertSort(std::vector& vec) { if (1 == vec.size()) { return; } for (int i = 1; i < vec.size(); i++) { in原创 2017-03-20 15:54:11 · 217 阅读 · 0 评论 -
选择排序
/* 选择排序,时间复杂度O(n^2) */ static void selectSort(std::vector& vec) { if (vec.empty()) { return; } for (int i = 0; i < vec.size(); i++) { int index = i; for (int j = i + 1; j < vec.si原创 2017-03-20 15:53:40 · 203 阅读 · 0 评论 -
希尔排序
/* 插入排序的变种,通过增量这一特性,减少了数据比较和移动次数,是一种优化的插入排序 */void shellSort(std::vector& vec){ int rate = 2; int increNum = vec.size() / rate; while(increNum) { for原创 2017-03-20 15:52:36 · 216 阅读 · 0 评论 -
堆排序
/* 调整堆, 向下调整的过程 */ static void heapAdjust(std::vector &vec, int start, int end) { int i = start; while((2*i + 1) < end) { int maxIndex = 2*i + 1; if ((2*i + 2) < end) { if原创 2017-03-20 15:50:46 · 244 阅读 · 0 评论 -
冒泡排序算法
比较简单,以冒泡排序开始自己的第一篇博文/* 冒泡排序:从头开始依次比较,若前一个值比后一个值大,则交换,否则不做任何操作,比如第一个与第二个比较,比较完成之后(交换或不交换),第二个与第三个比较,……,最后第n-1个与第n个值比较,交换或不交换,此时最大值放在了第n个值的位置;然后从头开始进行下一轮比较,比较到第n-1个位置,此轮最大值置于第n-1的位置;继续下一轮,直至剩余一个元素原创 2017-03-02 14:54:42 · 270 阅读 · 0 评论 -
二叉排序树
/* 二叉查找树,中序遍历为从小到大的顺序,在查找树基本平衡时,复杂度logn,若退化成一条线时,复杂度n */#include#include#include #include#include typedef struct _SearchTree{ int data; int times; struct _SearchTree *pLChild; struct _Sea原创 2017-03-09 17:39:38 · 242 阅读 · 0 评论 -
插入排序
/* 插入排序, 复杂度O(n^2),在基本有序时,效率较高,倒序时最差 原理:将元素一个个插入已经排好序的队列中 */ static void insertSort(std::vector& vec) { if (1 == vec.size()) { return; } for (int i = 1; i < vec.size(); i++) { in原创 2017-03-16 15:26:34 · 207 阅读 · 0 评论