2007winter

做自己真心想做的事,你就没事了

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

随笔分类 -  数据结构

摘要:所谓归并(merging)是将链两个或两个以上的有序表合并成一个新的有序表。先考虑一种特殊情形:设线性表L[1:n]中的某段L[low:high]已经部分有序,即它的两个子表L[low:mid]与L[mid+1:high]已经有序,现要将这两个有序子表归并成一个有序子表L[low:high]。实现上述两个子表的归并,基本做法如下:(1) 开辟一个与线性表L同样大小的表空间A;(2) 设置三个指针i,j,k,其初始状态分别指向两个有序子表的首部及表空间A中与L中需要进行排序段相对应空间的首部。即i=low, j=mid+1, k=0;(3) 沿两个有序子表扫描:若L[i]<L[j],则A[ 阅读全文
posted @ 2012-06-08 15:15 2007winter 阅读(140) 评论(0) 推荐(0)

摘要:希尔排序是一种插入排序方法,实际上是一种分组插入方法。其基本思想是:先取一个小于n的整数d1作为第一个增量,所有距离为d1的倍数的记录放在同一个组中,在各组内进行直接插入排序;然后,取第二个增量d2<d1,重复上述的分组和排序,直至所取的增量dt=1,即所有记录放在同一组中进行直接插入排序为止。希尔排序是不稳定的。代码:#include <iostream>using namespace std;void shellsort(double R[],int n){ int i,j,increment; double temp; increment=n/2; while (... 阅读全文
posted @ 2012-06-08 10:58 2007winter 阅读(121) 评论(0) 推荐(0)

摘要:选择排序的基本思想是:扫描整个线性表,从中选出最小的元素,将它交换到表的最前面(这是它应有的位置);然后对剩下的子表采用同样的方法,直到子表空为止。对于长度为n的序列,选择排序需要扫描n-1遍,每一遍扫描均从剩下的子表中选出最小的元素,然后将该最小的元素与子表中的第一个元素进行交换。第i趟排序开始时,当前有序区和无序区分别为R[0…i-1]和R[i…n-1],该趟排序则是从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R[i]交换,使R[0…i]和R[i+1…n-1]分别为新的有序区和新的无序区。因为每趟排序均使有序区中增加了一个记录,且有序区中的记录关键字均不大于无序区中 阅读全文
posted @ 2012-06-08 10:25 2007winter 阅读(158) 评论(0) 推荐(0)

摘要:快速排序是由冒泡排序改进而得的,也是交换排序的一种。快速排序的基本思想如下:从线性表中选取一个元素,设为T,然后将线性表后面小于T的元素移到前面,而前面大于T的元素移到后面,结果就将线性表分成了两部分(称为两个子表),T插入到其分界线的位置处。这个过程称为线性表的分割。通过对线性表的一次分割,将线性表分为前后两个字表,且前面子表中的所有元素均不大于T,而后面子表中的所有元素都不小于T。如果对分割后的子表再按上述原则进行分割,并且这种分割可以一直做下去,直到所有子表为含有一个元素,此时线性表就变成了有序表。快速排序的平均时间复杂度为O(nlogn),它是不稳定的。代码:#include < 阅读全文
posted @ 2012-06-07 15:26 2007winter 阅读(118) 评论(0) 推荐(0)

摘要:冒泡排序是一种典型的交换排序方法,其基本思想是:从第一个记录R1开始,对每两个相邻的关键字ki和ki+1进行比较,若ki>ki+1,则交换Ri和Ri+1的位置 ,使关键字较小的记录换到关键字较大的记录之前。经过一趟冒泡排序后,关键字最小的记录到达最前端,接着,在剩下的记录中找关键字次小的记录,并把它换在第二个位置上。以此类推,一直到所有记录都有序为止。冒泡排序的平均时间复杂度为O(n2),它是稳定的。代码:#include <iostream>using namespace std;#define T double//升序void bubble_sort(T R[],int 阅读全文
posted @ 2012-06-07 10:12 2007winter 阅读(128) 评论(0) 推荐(0)

摘要:插入排序的基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子表中的适当位置,直到全部记录插入完为止。假设待排序的记录存放在数组R[0,...,n-1]中,排序过程的某一中间时刻,R被划分成两个子区间R[0,...,i-1]和R[i,...,n-1]。其中,前一个子区间是已排好序的有序区;后一个子区间是当前未排序的部分,不妨称其为无序区。直接插入排序的基本操作是将当前无序区的第1个记录R[i]插入到有序区R[0,...,i-1]中适当位置上,使R[0,...,i]变为新的有序区。这种方法通常称为增量法,因为每次使有序区增加1个记录。直接插入排序的时间复杂度为O(n2),它是 阅读全文
posted @ 2012-06-07 09:58 2007winter 阅读(121) 评论(0) 推荐(0)

摘要:将数据和二叉链表的各种运算(如二叉链表的生成,二叉链表的前序、中序、后序遍历)封装在一起,构成二叉链表类。Binary_Tree.h:#include <iostream>using namespace std;//定义二叉链表结点类型template<class T>struct Btnode{ T d; Btnode *lchild; Btnode *rchild;};//二叉链表类template<class T>class Binary_Tree{private: Btnode<T> *BT;public: Binary_Tree() { 阅读全文
posted @ 2012-06-04 11:11 2007winter 阅读(222) 评论(0) 推荐(0)