- 博客(7)
- 收藏
- 关注
原创 树的遍历(递归、非递归)
B树class BTreeNode { public: BTreeNode(int i) : lchild(NULL), rchild(NULL) {} public: int value; BTreeNode *lchild; BTreeNode *rchild; };递归遍历递归式遍历的前序、中序、后序,总体结构一致,只在于处理方法调用的时机。
2017-08-06 09:37:15 310
原创 二分查找(递归与非递归)
条件 数据存储在有序数组中; 数据有序排列。 (以下以升序为例)递归输入的参数为数组下标的上下界,这是因为不同层的递归需要区分int BinarySearchRec(int arr[], int low, int high, int target) { if (arr == NULL || low > high) // 都要考虑点非法输入 return
2017-08-05 19:24:30 189
原创 堆排序
排序思路分析以升序为例,堆排序分为两个阶段: 1. 构建初始大顶堆(堆中每个节点都比左右child大); 2. 对大顶堆,每次都将堆顶元素与最后一个leaf交换,再对剩下的元素构建大顶堆,如此循环n次。解释1. 为什么升序/降序构建的是大顶堆/小顶堆?因为第2步中,每次都是将堆顶元素后置,故数组排序是从后往前完成的,故与升降序表意相反2. HeapSort第二个参数n是什么?类似QuickSor
2017-08-05 00:38:11 155
原创 快速排序
快速排序的实现分为两个步骤: 1. 将输入的数组取pivot,按照各个数据的大小关系,移动`为左右两段(< pivot及>= pivot) 2. 对左段和右段递归处理。递归好说,不好记的在于如何对于一个数组,取pivot之后将其他数据按大于小于关系,移动到左右,构成递归下一层的两段。这里的实现是,用i和j分别从前后向中间移动,i指向的是从前往后的第一个>=pivot的值;j指向的是从后往前的第一
2017-08-01 22:54:12 160
原创 归并排序
归并排序分为三块 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
原创 插入排序、冒泡排序、选择排序
这三种排序方法都需要两层循环,故时间复杂度都是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 191
原创 手撸代码目录
数据结构list vector deque stack queue tree排序插入排序 冒泡排序 选择排序 归并排序 堆排序 快速排序查找二分查找设计模式单例 适配器 工厂C libatoi, itoa strcpy, strncpy strlen memcpy, memmove
2017-07-23 15:24:30 422
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人