数据结构
moses1213
积跬步,至千里;积小流,成江海!
展开
-
几种排序算法
本帖依据学习进度持续更新《数据结构与算法分析-c语言描述》学到第七章,是时候该系统的学习一下排序算法了。首先学到的是插入排序,算法就不赘述了,书上博客上到处都有。书上的两个定理还不太明白:定理7.1N个互异数的数组的平均逆序数是N(N-1)/4。定理7.2通过交换相邻元素进行排序的任何算法平均需要Ω(N^2)时间。插入排序的算法复杂度应该为O(N^2)才对。下面是我的测原创 2015-01-28 15:42:13 · 485 阅读 · 0 评论 -
堆和优先队列
学习数据结构的时候就学习过堆,不过忘了很多了,《编程珠玑》里也有这一章,因此重新总结一下。堆的两个性格:(1)顺序性质:任何结点的值都小于或等于子结点的值。(对于最小堆而言) (2)形状性质:二叉树结构,最多在两层上具有叶结点,其中最底层的结点尽可能的靠左分布。堆的实现:考虑以数组实现,对于大小为n的堆,声明数组x[n+1],下标从1开始并浪费x[0]。树种常见的函数定义如下:原创 2016-01-24 16:10:14 · 453 阅读 · 0 评论 -
链表的反转
两种思路:第一种方法,设有新旧两个链表,新链表为要求反转后的链表,初始值为NULL,旧链表为原链表。每次旧链表上取一个结点放在新链表的表头,直到旧链表取完,重新设置表头,则新链表就是反序的。简单演示一下:null, L->1->2->3->4->5…第一步之后变成:L, null3->4->5…第二部:L, null4->5…直到最后,把L指向新的原创 2016-03-03 16:14:48 · 292 阅读 · 0 评论 -
链表中二级指针的使用
转载自:http://www.cnblogs.com/gentleh/p/3960608.Coolshell图文并茂说明了这个问题——我们在删除链表的时候,常常需要记录该结点在链表中是否有前趋prev。如果有,那么需要把prev->next指向该结点的next域,然后再删除该结点,这样才能保证链表不会因为删除结点而“断开”。像这样:void remove(list_node **ref转载 2016-03-30 11:43:32 · 431 阅读 · 0 评论 -
二叉树的实现
代码来自《剑指offer》。//BinaryTree.h// 《剑指Offer——名企面试官精讲典型编程题》代码// 著作权所有者:何海涛#pragma oncestruct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; Binary原创 2016-03-30 15:45:02 · 275 阅读 · 0 评论 -
链表的实现
编程初学者,记录学习过程。1.单链表的实现:#include#include#includestruct node{ ElemtType Element; Position Next;};list makeEmpty(list L){ if(L != NULL) deleteList(L); L = malloc( sizeof( s原创 2015-01-07 15:18:47 · 387 阅读 · 0 评论 -
只用下滤法建堆以及最大(小)堆的实现
在堆和优先队列讲过用上滤法建堆的过程,然后堆排序的时候又要用到下滤法。其实下滤也可以实现建堆的过程:以最大堆为例,考虑深度最大的一层父结点,如果存在父结点比子结点小,那么父结点下沉,子结点上移,这个过程实现了较大的结点上滤,较小的结点下滤,至此完成了树的最底两层的有序排列。然后考虑倒数第三层和倒数第二层的排序,同样是一个倒数第二层下滤的过程,注意这个过程可能不止下滤一层,只要比子结点小,那么结点就原创 2016-06-03 20:25:35 · 3185 阅读 · 0 评论 -
二叉树的递归和非递归遍历方法
void myPrintTree(BinaryTreeNode* pRoot){ if(pRoot == NULL) return; BinaryTreeNode* pNode = pRoot; std::stack stackTreeNode; stackTreeNode.push(pNode); while(!stackTreeNode.empty()) {原创 2016-07-22 11:31:42 · 253 阅读 · 0 评论 -
C++ STL--stack/queue 的使用方法
转自:http://www.cnblogs.com/mfryf/archive/2012/08/09/2629992.html1、stackstack 模板类的定义在头文件中。stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型为deque。定义stack 对象的示例代码如下:stack s1;转载 2016-07-19 10:55:59 · 290 阅读 · 0 评论 -
STL---heap概述,make_heap,sort_heap,pop_heap,push_heap
heap并不属于STL容器组件,它分为 max heap 和min heap,在缺省情况下,max-heap是优先队列(priority queue)的底层实现机制。而这个实现机制中的max-heap实际上是以一个vector表现的完全二叉树(complete binary tree)。二叉堆(binary heap)就是i一种完全二叉树。也即是。整棵二叉树除了最底层的叶节点以外,转载 2016-05-06 16:23:18 · 2340 阅读 · 0 评论 -
双向循环链表两个节点交换的原则
假设q是p的前驱结点; 总共分三阶段 1.p与新前驱建立联系 q->llink->rlink=p;p->link=q->llink;2.q与新后驱建立联系 p->rlink->llink=q;q-rlink=p->rlink;3.p与q互连p->rlink=q;q->llink=p;:总结一下其实在交换过程中要注意的就是不能丢掉前后两端结点的转载 2015-10-31 15:55:36 · 6778 阅读 · 2 评论 -
优先队列
package com.manni;/** * * @date 2014-04-12 * @author fei.cheng * */public class PriorityQueue { private int[] Q; private int capacity; public PriorityQueue(int initialCapacity)原创 2015-01-26 09:47:32 · 353 阅读 · 0 评论 -
优先队列(二叉堆)的插入程序
课后习题中的一道二叉堆的插入问题,答案给出了两种结果,但是按二叉堆的插入算法应该只有一种结果,下面是我用程序实现的:#include#includetypedef struct heapStruct{ int Capacity; int Size; int *Elements;}*priorityQueue;priorityQueue initQueue(in原创 2015-01-24 21:39:57 · 498 阅读 · 0 评论 -
分离链接散列表的删除例程
链表中删除操作的直接实现void Delete(ElementType Key, HashTable H){ Position pos; List L, P, Tmp; if(pos == NULL) FatalError("Do not exist); else { L = H->TheList[Hash(Key, H原创 2015-01-14 16:30:24 · 625 阅读 · 0 评论 -
二叉堆中的例程汇总
void Insert(int X, priorityQueue H) { int i; if(isFull(H)) { printf("Priority queue is full"); return; } for(i = ++H->Size; H->Elements[i/2] > X;原创 2015-01-26 21:34:19 · 383 阅读 · 0 评论 -
向AVL树进行插入的非递归函数
根据书上的递归版本试着实现非递归版,关键是找到该插入的树叶的位置。AvlTree Insert(ElementType X, AvlTree T){ AvlTree Tmp = T; if(T == NULL) { T = malloc(sizeof(struct AvlNode)); if(T == NULL)原创 2015-01-13 20:33:41 · 2056 阅读 · 2 评论 -
实现基本二叉查找树操作的例程
二叉树查找树声明:struct treeNode;typedef struct treeNode *Position;typedef struct treeNode *searchTree;struct treeNode{ ElementType Element; searchTree Left; searchTree Right;};建立一个空树的例程se原创 2015-01-12 22:04:27 · 706 阅读 · 3 评论 -
五种排序算法比较
目前已学过插入排序,希尔排序,堆排序,归并排序和快速排序,其中希尔排序增量序列的选取和快速排序中枢纽元的选取都会影响算法性能。本例子中希尔排序的增量序列采用的shell建议的,即初始增量为数字长度的一半,下一个增量为前一个增量的一半。(可能不是最好的增量序列)。快速排序枢纽元选用的是三数中值。还是测试200000个数排序时间,这里仅附上主程序:void main(){ srand(time原创 2015-02-02 18:52:37 · 617 阅读 · 0 评论 -
两种快速排序算法比较
1.选择将第一个元素作为枢纽元。如果输入是随机的,那么这是可以接受的,但如果输入是预排序的或者反排序的,那么这样的枢纽元就产生一个劣质的分割,因为所有的的元素不是被划入S1就是被划入S2。更有甚者,这种情况发生在所有的递归调用中。实际上,如果第一个元素作为枢纽元而且输入是预先排序的,那么快速排序花费的时间将是二次的。2.三数中值分割法。一组N个数的中值是第[N/2]个最大的数。枢纽元最好的选择原创 2015-02-02 18:33:19 · 514 阅读 · 0 评论 -
C语言实现的简单的逆波兰计算器
前后调试了好几天,类型转换问题颇为麻烦,无赖使用两种不同类型的栈解决,但程序目前还有两个问题:1.目前不能记性float类型的计算;2.不能进行多位数的运算。实际上就是目前只能进行个位数的带括号的加减乘除运算,目前只能写到这一步,期待后续改进。#include#include#include#define CAPACITY 50typedef struct stack{原创 2015-01-16 13:13:58 · 1719 阅读 · 0 评论 -
左式堆的deletdMin例程
《数据结构与算法分析》书上的左式堆,deleteMin例程没有完整给出,自己试着实现一下:ElementType deleteMin(priorityQueue H){ ElementType Tmp; Tmp = findMin(H); deleteMin1(H); return Tmp;}priorityQueue deleteMin1(priorit原创 2015-01-22 11:40:41 · 531 阅读 · 0 评论 -
二叉堆的插入例程
正在看数据结构的二叉堆部分,书上的插入例程似乎有问题,而且没有考虑到边界条件。void Insert(ElementType X, priorityQueue H){ int i; if(isFull(H)) { Error("Priority queue is full"); return; } for(i = ++H->S原创 2015-01-21 17:28:58 · 580 阅读 · 0 评论 -
基本排序算法总结
排序算法很多,这里做个总结,最重要的是记住算法思想,而不是记住程序怎么写。程序过一段时间就会忘了,算法原理熟悉了现场写出来应该是很容易的。时间复杂度为O(n^2)的三种排序算法:插入排序、选择排序、冒泡排序。插入排序:插入排序是选定元素找位置。对于位置为p上的元素,假定0~p-1的元素已经排序,如果p比它前面的元素小,那么p上的元素应该向前移动,直到p前面所有的元素都比它小为止。voi原创 2016-06-02 16:42:58 · 394 阅读 · 0 评论