摘要: 链表是面试中常见的题目之一。下面列出常见的链表面试题。本随笔主要针对两链表求并,求交。1)【链表反向按序求并】两个按递增次序排列的单链表,编写算法合并,按递减次序排列,并要求利用原来两个单链表的结点存放新的链表。LinkList Union(LinkList la,lb) { pa=la->next; pb=lb->next;// pa,pb是工作指针 la->next=null;// la为结果链表的头指针 while(la&&lb) { if(pa->data<=pb->data) { r=pa->next;// 将pa的后继暂存于 阅读全文
posted @ 2012-07-25 20:43 代码改变未来 阅读(740) 评论(0) 推荐(0) 编辑
摘要: http://blog.csdn.net/hhygcy/article/details/4584064 阅读全文
posted @ 2012-07-25 20:23 代码改变未来 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 一个中位数(median)是它所在集合的“中点元素”,当n为奇数时,i=(n+1)/2,当n为偶数是,中位数总是出现在 (下中位数)和(上中位数)。找最大值/最小值问题,通过比较n-1次可以得出结果。MINIMUM(A) min ← A[1] for i ← 2 to length[A] do if min > A[i] then min ← A[i] return min如果要同时找出最大值和最小值,则比较次数最少并不是2*n-2,而是,我们可以将一对元素比较,然后把较大者于max比较,较小者与min比较,这样就只需要。如果是一般的选择问题,即找出一段序... 阅读全文
posted @ 2012-07-24 22:36 代码改变未来 阅读(764) 评论(0) 推荐(0) 编辑
摘要: 计数排序#include <iostream> #include <iomanip> #include <time.h> #include <stdlib.h> #define MIN -65536 using namespace std;int * Create_Array (int *, int, int); void Print_Array (int *, int); int * Count_Sort (int *, int *, int *, int, int);int main (void) { int *Array = NULL, * 阅读全文
posted @ 2012-07-22 22:49 代码改变未来 阅读(280) 评论(0) 推荐(0) 编辑
摘要: 直接插入排序int insertsort(int x[],int n){ int i,j,t; for(i=0;i<n;i++) { t=x[i]; for(j=i;j>=0&&x[j-1]>t;j--) { x[j]=x[j-1]; } x[j]=t; }}折半插入void BiInsertionSort(SqList &L){ //对顺序表L作折半插入排序 for(i=2; i<=L.length; ++i){ L.r[0] = L.r[i]; low = 1; high = i-1; //查找i记录应该插入的位置,必定是h... 阅读全文
posted @ 2012-07-20 23:55 代码改变未来 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 冒泡排序的思想很简单,就是以此比较相邻的元素大小,将小的前移,大的后移,就像水中的气泡一样,最小的元素经过几次移动,会最终浮到水面上。举例分析说明一下,如下数据:2 7 4 6 9 1 首先比较最后两个数字,发现1比9小,于是前移2 7 4 6 1 9 然后比较6和12 7 4 1 6 9 继续前移,然后是4和12 7 1 4 6 9 7和1比较2 1 7 4 6 9 2和11 2 7 4 6 9 至此,第一趟冒泡过程完成,最小的元素1被移到第一个,不再参与后面的排序过程。下一趟冒泡过程同理,比较6和9,以此类推,最终得到结果。void bubblesort(int v[]){for (int 阅读全文
posted @ 2012-07-19 21:42 代码改变未来 阅读(196) 评论(0) 推荐(0) 编辑
摘要: 归并算法 将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]。 将SR[s..t]归并排序为TR1[s..t]。 对顺序表L作归并排序。 C++可执行代码: 阅读全文
posted @ 2012-07-19 13:44 代码改变未来 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 交换位置/* 交换顺序表L中子表的记录,使枢轴记录到位,并返回其所在位置 *//* 此时在它之前(后)的记录均不大(小)于它。 */ int Partition(SqList *L,int low,int high) { int pivotkey; pivotkey=L->r[low]; /* 用子表的第一个记录作枢轴记录 */ while(low<high) /* 从表的两端交替地向中间扫描 */ { while(low<high&&L->r[high]>=pivotkey) high--; swap(L,low,high); /* 将比枢轴记录 阅读全文
posted @ 2012-07-18 22:27 代码改变未来 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 优先级队列与堆相似,此处用小根堆模拟优先级队列。当前最小的值存在x[1]。insert 操作void insert(T t){int i,p;x[++n]=t;//把t插入到x[n]for(i=n;i>1&&x[p=i/2]>x[i];i=p)//如果父节点比子节点大swap(x[p],x[i]);//交换两元素}查找并删除当前的最小值T extractmin(){int i,c;T t=x[1];x[1]=x[n--]//替换x[1]为x[n]for(i=1;(c=2*i)<=n;i=c){if(c+1<=n&&x[c+1]<x[ 阅读全文
posted @ 2012-07-17 22:47 代码改变未来 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 大根堆的调整:// array是待调整的堆数组,i是待调整的数组元素的位置,nlength是数组的长度void HeapAdjust(int array[], int i, int nLength){ int nTemp=array[i]; for (int j = 2 * i + 1 ; j < nLength; j = j * 2 + 1) { // 沿key较大的孩子结点向下筛选 if (j < n-1 && (array[j+1] > array[j])) ++j;//j为key较大的记录的下标 if (nTemp < array[j]) { a 阅读全文
posted @ 2012-07-17 22:26 代码改变未来 阅读(164) 评论(0) 推荐(0) 编辑