![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
xarpuia
这个作者很懒,什么都没留下…
展开
-
插入排序、冒泡排序、选择排序
这三种排序方法都需要两层循环,故时间复杂度都是O(n)插入排序核心思想数组被分为前后两段,前一段已排序,后一段未排序。 每次取后一段的第一个数,往前查找合适的位置并插入。// 升序版本void InsertSort(int arr[], size_t n) { for (int i = 1; i < n; i++) { // 第0个元素开始时默认已排好序,故从1开始 in原创 2017-07-24 07:51:05 · 187 阅读 · 0 评论 -
手撸代码目录
数据结构list vector deque stack queue tree排序插入排序 冒泡排序 选择排序 归并排序 堆排序 快速排序查找二分查找设计模式单例 适配器 工厂C libatoi, itoa strcpy, strncpy strlen memcpy, memmove原创 2017-07-23 15:24:30 · 415 阅读 · 0 评论 -
堆排序
排序思路分析以升序为例,堆排序分为两个阶段: 1. 构建初始大顶堆(堆中每个节点都比左右child大); 2. 对大顶堆,每次都将堆顶元素与最后一个leaf交换,再对剩下的元素构建大顶堆,如此循环n次。解释1. 为什么升序/降序构建的是大顶堆/小顶堆?因为第2步中,每次都是将堆顶元素后置,故数组排序是从后往前完成的,故与升降序表意相反2. HeapSort第二个参数n是什么?类似QuickSor原创 2017-08-05 00:38:11 · 152 阅读 · 0 评论 -
快速排序
快速排序的实现分为两个步骤: 1. 将输入的数组取pivot,按照各个数据的大小关系,移动`为左右两段(< pivot及>= pivot) 2. 对左段和右段递归处理。递归好说,不好记的在于如何对于一个数组,取pivot之后将其他数据按大于小于关系,移动到左右,构成递归下一层的两段。这里的实现是,用i和j分别从前后向中间移动,i指向的是从前往后的第一个>=pivot的值;j指向的是从后往前的第一原创 2017-08-01 22:54:12 · 158 阅读 · 0 评论 -
二分查找(递归与非递归)
条件数据存储在有序数组中;数据有序排列。(以下以升序为例)递归输入的参数为数组下标的上下界,这是因为不同层的递归需要区分int BinarySearchRec(int arr[], int low, int high, int target) { if (arr == NULL || low > high) // 都要考虑点非法输入 return原创 2017-08-05 19:24:30 · 188 阅读 · 0 评论 -
树的遍历(递归、非递归)
B树class BTreeNode {public: BTreeNode(int i) : lchild(NULL), rchild(NULL) {} public: int value; BTreeNode *lchild; BTreeNode *rchild;};递归遍历递归式遍历的前序、中序、后序,总体结构一致,只在于处理方法调用的时机。原创 2017-08-06 09:37:15 · 307 阅读 · 0 评论 -
归并排序
归并排序分为三块 1. 对外接口; 2. 迭代方法; 3. 将分别排好序的两段merge。// 1. 对外接口void MergeSort(int arr[], int len) { int *buf = new int[len]; // 只使用一个buf MergeSortDC(arr, 0, len - 1, buf); }// 2. 迭代vo原创 2017-07-25 00:08:59 · 178 阅读 · 0 评论