数据结构
wswifth
菜鸟,无限学习中……
展开
-
冒泡排序
冒泡排序属于交换排序的一种,交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。它的时间复杂度为O(n^2),虽然不及堆排序、快速排序的O(nlogn,底数为2),但是有两个优点:1.“编程复杂度”很低,很容易写出代码;2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序、快速排序均不具有稳定性。由于冒泡排序记录移动次数较多,故平均时间性能比直接插入排序要差得多。实现代码:#includeusing name原创 2010-08-21 19:01:00 · 981 阅读 · 0 评论 -
快速排序
<br />快速排序是一种划分交换排序,它采用的是分治法的策略。<br /> <br />分治法的基本思想:将原问题分解为若干个规模更小但结构与原问题相似的子问题,递归的解这些子问题,然后将这些子问题的解组合为原问题的解。<br /> <br />下面是一个快速排序法的程序,在这个代码中,首先将代排序数组的第一个单元作为flag(比较标志位)。随后从数组的末尾进行比较,如果发现有数据单元a的值小于flag,那么就将他存入第一个数组单元。此时j指向a。随后开始从数组前进行搜寻比较,直到发现有一个值比flag要原创 2010-08-22 14:40:00 · 1037 阅读 · 1 评论 -
直接插入排序,希尔排序
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。 第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。 直接插入排序属于稳定的排序,时间复杂性为o(n^2),空间复杂度为O(1)。 直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一原创 2010-08-21 20:05:00 · 2275 阅读 · 0 评论 -
树的基本定义,二叉树,二叉排序树,森林,最优二叉树(哈夫曼树,哈夫曼编码)
遍历二叉树的三种方式:先序遍历,中序遍历,后序遍历线索二叉树二叉树的深度计算排序二叉树:树和森林:在这里,保存树和森林的办法是用二叉树作为保存方式,还是通过链式结构进行保存,每个节点的左边保存的为该节点的第一个孩子节点,而后节点则为该节点所在深度的下一个兄弟节点。如下图:最优二叉树(哈夫曼树)哈夫曼编码:它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。如下例:原创 2010-08-24 20:41:00 · 3045 阅读 · 0 评论 -
二分查找,分块查找,哈希查找
二分查找法:如下例程序:#includeusing namespace std;//快速排序进行排序void quickSort(int* qs,int low,int high){ int flag = 0; //比较标志位 int i=low,j=high; //游标 flag = qs[low]; if(high > low) { while(j>i) { while((j>i)&&(flagi)&&(fla原创 2010-08-26 20:33:00 · 2477 阅读 · 0 评论 -
选择排序,堆排序,归并排序
选择排序堆排序:#includeusing namespace std;void print(int*,int);/* *堆排序*/void sift(int* s,int len,int i){ int j,temp; if((2*i+1) len)//只有左节点 { if(s[i] > s[2*i+1]) //父节点和左子节点互换 { temp = s[2*i+1]; s[2*i+1] = s[i]; s[原创 2010-09-01 20:47:00 · 776 阅读 · 0 评论