
数据结构
文章平均质量分 79
comwise
这个作者很懒,什么都没留下…
展开
-
插入排序之希尔排序(Shell Sort)
希尔排序:缩小增量排序,属于插入排序的一种,从前面的直接插入时间分析可知,其时间复杂度为O(n^2),若待排序的记录基本有序,其时间复杂度可以提高至O(n)基本思想:先将整个待排序的记录序列分割为若干个子序列分别进行直接插入排序,,待整个序列基本有序时,再对全体记录进行一次直接插入排序特点:1)子序列不是简单的分段,而是相隔某个增量的记录组成一个子序列2)增量务必是素数或者说质数,原创 2013-12-29 22:56:25 · 911 阅读 · 0 评论 -
冒泡算法的改进
冒泡排序算法的思想:首先将第一个记录的关键字和第二个关键字进行比较,若为逆序则将两个记录进行交换。然后比较第二个记录和第三个记录的关键字,直至第n-1个记录和第n个记录进行比较为止,一趟过后最大的元素会沉入最底部。然后进行第二趟排序,对前 n-1 个记录进行同样1、2的操作,结果就是关键字次大的记录被安排到n-1位置上。依次进行第 i 趟排序,对前 n-i 个记原创 2013-12-20 23:03:40 · 1624 阅读 · 0 评论 -
顺序存储的栈
栈定义:仅限在表尾进行插入和删除的线性表栈的特点:1)一般来说能在表尾进行进栈和出栈的数据2)先进后出(last in first out )3)栈会有栈顶,栈底,通常栈底为高地址,栈顶为高地址,如下图所示原创 2014-01-06 13:54:07 · 1150 阅读 · 0 评论 -
二叉树先序遍历的非递归算法
在前面一文,说过二叉树的递归遍历算法(二叉树先根(先序)遍历的改进),此文主要讲二叉树的非递归算法,采用栈结构总结先根遍历得到的非递归算法思想如下:1)入栈,主要是先头结点入栈,然后visit此结点2)while,循环遍历当前结点,直至左孩子没有结点3)if结点的右孩子为真,转入1)继续遍历,否则退出当前结点转入父母结点遍历转入1)先看符合此思想的算法:int PreO原创 2014-01-06 14:58:29 · 12165 阅读 · 1 评论 -
选择排序与冒泡排序的比较
选择排序(Selection Sort)算法核心思想:每一趟在n-i+1(i>=1)个记录中选取关键字最小的记录作为序列中的第i个记录简单选择操作:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1先看一个选择排序的思想的代码:int SelectSort(MergeType *L){ int min = 0; if (!L->elem) {原创 2013-12-23 22:56:10 · 1033 阅读 · 6 评论 -
直接插入排序与折半插入排序
这里从第二个数据开始,比较当前的数据是否小于前面的一个数,如果小于前面一个数据,就将当前数据插入到前面的队列中,在插入到前面数据中的过程,要移动数据这里要注意时间的复杂度:总的比较次数=1+2+……+(i+1-2+1)+……+(n-2+1)= n*(n-1)/2= O(n^2)总的移动次数=2+3+……+(2+i-1)+ …… + n = (n+2)*(n-1)/2=O(n^2)当然还要考虑空间复杂度:其实这里使用了一个变量的存储空间作为移动数据的临时空间这里在移动的过程中,可以减少代码原创 2013-12-23 21:41:53 · 1435 阅读 · 0 评论 -
二叉树先根(先序)遍历的改进
二叉树的特点:每个结点的度最大不能超过2,并且左右子树不能颠倒二叉树的存储结构:下面采用链式存储进行阐述,堆排序算法(快速排序改进)采用的顺序存储结构的二叉树,先看如下结构体的存储方式顺序存储:/*二叉树的顺序存储*/#define MAX_TREE_SIZE 100typedef TElemType SqBiTree[MAX_TREE_SIZE];链式存储:/*二叉原创 2013-12-28 14:01:05 · 2015 阅读 · 0 评论 -
快速排序算法(冒泡算法的改进)
快速排序算法的思想: 1. 通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的记录的关键字小 2. 然后分别对这两部分进行同样的操作 1 的快速排序,以达到整个序列有效原创 2013-12-22 17:09:28 · 1452 阅读 · 0 评论 -
堆排序算法(选择排序改进)
首先要理解堆的含义:要么所有节点都不大于其子孩子节点数据,要么都不小于其子孩子节点数据堆排序的核心思想:就是要满足所有节点都满足上面两点,如何完成堆排序的步骤:1.首先要建成一个大顶堆或者小顶堆,在建的过程中其实就是调整节点的位置,首先要从最后最后一个节点的母亲节点开始,按照堆的含义调整。为什么不是最后一个或者其他?因为要保证完整性和不必要性,所以只需从最后一个的母亲节点开始即可(下面的堆原创 2013-12-26 21:41:53 · 1288 阅读 · 0 评论 -
归并排序算法之错误修正
归并排序:将两个或者两个以上的有序表合并成一个新的有序表,二路归并就是一组数组中前后相邻的两个有序序列归并为一个有序序列二路归并的核心思想:假设有n个序列,然后两两归并,得到[n/2]个长度为2或者1的子序列;然后再两两归并,……,直至得到一个长度为n的有序序列为止看下面2路归并算法的实例:int MSort(MergeType S, MergeType *pT, int nStart, int nEnd){ int nMidPos = 0; if ( !S.elem || nStart > n原创 2013-12-26 21:54:36 · 1547 阅读 · 0 评论 -
如何使用Windows API获取IP、MAC
这里用的两个函数:gethostbyname/gethostbyaddr,GetAdaptersInfo,这里主要通过获取IP看链表的操作,如下获取所有IP地址的函数,如下:int CIPInfo::GetIPInfo(const char * szHostName){ char szHost[HOST_NAME_MAX]; HOSTENT* pHost; char* szIPAddr = NULL;原创 2013-12-29 16:18:08 · 3961 阅读 · 0 评论