2016计算机考研:数据结构常用算法精析

不知道博客园有没有计算机专业的考研党,希望列举的计算机考研考点能帮助大家吧,以下就是数据结构常用算法精析,如果大家看有什么不对的地方,欢迎纠错指正啊哈哈哈。2016考研加油!!!!!!!!!

内部排序(在内存中进行的排序不需要访问外存的)外部排序(排序量很大,通过分批的读写外存,最终完成排序)

稳定排序和非稳定排序:看相同记录的相对次序是否回发生改变。主要看在排序过程中的比较是不是相邻记录,如果是相邻比较,一定是稳定的排序。如果不是相邻的比较,就是不稳定的。

内排序方法 截止目前,各种内排序方法可归纳为以下五类:

(1)插入排序;(2)交换排序;(3)选择排序;(4)归并排序; (5)基数排序。

插入排序:包括直接插入排序和希尔排序

直接插入排序:(稳定的)

算法描述

void Insort (sqList &L) ∥对顺序文件F直接插入排序的算法∥

{ int i,j;

for (i=2;i<=L.len;i++) ∥插入n-1个记录∥

{

if(L.R[i].key

{ L.R[0]=L.R[i]; ∥待插入记录先存于监视哨∥

L.R[i]=L.R[i-1];

for(j=i-2;L.R[0].key

L.R[j+1]=L.R[j]; ∥记录顺序后移∥

L.R[j+1]=L.R[0]; ∥原R[i]插入j+1位置∥

}

}

}

算法分析

设排序中key比较次数为C,C最小时记为Cmin,最大时记为Cmax。

(1)当原来就有序(正序)时,每插入一个R[i]只需比较key一次,即:

(2)当原本逆序(key从大到小)时,每插入一个R[i]要和子表中i-1个key比较,加上同自身R[0]的比较,此时比较次数最多,即:

(3)记录总的移动次数m(m最小时记为mmin,最大时记为mmax)

正序时,子表中记录的移动免去,即:

逆序时,插入R[i]牵涉移动整个子表。移动次数为2+(i-1)=i+1,此时表的移动次数最大,即:

排序的时间复杂度取耗时最高的量级,故直接插入排序的T(n)=O(n2)。

Shell(希尔)排序又称“缩小增量”排序(不稳定的)

交换类的排序:(起泡排序和快速排序)

起泡排序算法描述

void Bubsort (sqList &L)

{ int i,flag; ∥flag为记录交换的标记∥

Retype temp;

for (i=L.len;i>=2;i--) ∥最多n-1趟排序∥

{ flag=0; //记录每一趟是否发生了交换

for (j=1;j<=i-1;j++) ∥一趟的起泡排序∥

if (L.R[j].key>L.R[j+1].key) ∥两两比较∥

{ temp=L.R[j]; ∥R[j] ? R[j+1]∥

L.R[j]=L.R[j+1];

L.R[j+1]=temp;

flag=1;

}

if (flag==0) break; ∥无记录交换时排序完毕∥

}

}

算法分析

设待排长度为n,算法中总的key比较次数为C。若正序,第一趟就无记录交换,退出循环,Cmin=n-1=O(n);若逆序,则需n-1趟排序,每趟key的比较次数为i-1(2≤i≤n),故:

同理,记录的最大移动次数为:

故起泡排序的时间复杂度T(n)=O(n2)。并且是稳定的。

快速排序:(不稳定的,时间复杂度O(nlogn)),不需要辅助空间,但有最好和最差之分

分割算法

int Partition(Sqlist&L,int low,int high)

{ L.R[0]=L.R[low];

pivotkey=L.R[low].key;

while(low

{ while(low=pivotkey)

--high;

L.R[low]=L.R[high];

while(low

++low;

L.R[high]= L.R[low];

}

return low;

}

总控函数:

void QSort(Sqlist&L,int low,int high)

{ if(low

{

pivotloc=Partition(L,low,high);

QSort(L,low,pivotloc-1);

QSort(L,pivotloc+1,high);

}

}

调用方法:QSort(L,1,L,lenght);

算法分析:

若原本就正序或逆序,每次调用一次后,记录数只减少了一个,故此时T(n)=C(n+(n-1)+……+1)=O(n2)。这是快速排序效率最差的情况。所以快速排序算法有待改进。

简单选择排序: 属于稳定排序时间复杂度(O(n2))

算法描述

void Slectsort (Sqlist& L) ∥直接选择排序的算法∥

{

for (i=1;i

{

j=SeloctMinkey(L,i); //从i到L.len中选择key最小的记录

if (i!=j)

{ temp=L.R[i];

L.R[i]=L.R[j];

L.R[j]=temp;

}

}

}

堆排序:属于选择排序 不稳定,时间复杂度(O(nlogn)),没有最好和最差的分别,也需 要辅助的栈空间

若ki≥k2i、ki≥k2i+1。此时,根结点k1的值最大,称为“大根堆”。

若ki≤k2i、ki≤k2i+1满足“”关系,则k1最小,称为“小根堆”。

在堆排序中,我们采用的是大根堆,原因是大根堆中,根最大,对删除很方便,直接把它与最后一个叶子结点交换就可以了。

记录key集合k={k1 k2……kn}, 排序 分两步进行:

(1)将{k1 k2……kn}建成一个大根堆;

(2)取堆的根(key最大者),然后将剩余的(n-1)个key又调整为堆,再取当前堆

的根(key次大者),……,直到所有key选择完毕。

一个元素的堆调整算法:

//已知H.R[s...m]除H.R[s]之外,均满足堆的定义,本函数只是将H.R[s]放到已经是堆的堆中

void HeapAdjust (SqList& H, int s, int m) ∥将(H.R[s]……H.R[m])调整成大根堆∥

{

rc=H.R[s]; ∥暂存H.R[s]∥

for(j=2*s;j<=m; j*=2 )//沿key较大的孩子结点向下筛选

{

if (jL.R[j].key) j++; ∥令j为s的左右孩子key最大者的序号

if (rc.key>L.R[j].key)

break;//说明H.R[s]已经比当前堆中的所有元素大,已经是堆了,不需要调整了

L.R[s]=L.R[j]; ∥把最大的放到根结点

s=j; ∥把s与j交换,使得s与下层的堆比较

}

L.R[s]=rc; ∥最初的根回归∥

}

void Heapsort (SqList& H) ∥ 堆排序算法∥

{

//初始建堆

for (i=L.len/2; i>=1; i--) //从完全二叉树的最后一个非叶子结点开始

HeapAdjust (L,i,L.len); ∥调整(R[i]……R[n])为堆∥

//每次取下根(最大的元素)所谓的取下,只是放到数组最后,改变一下数组的下界

for (i=L.len;i>=2;i--) ∥总共摘n-1次∥

{ temp=F.R[1]; ∥根与当前最后一个结点互换∥

F.R[1]=F.R[i];

F.R[i]=temp;

HeapAdjust (L ,1,i-1); ∥把最后一个元素调整到合适的位置∥

}

}

二路归并排序:(稳定的,时间复杂度O(nlogn)又稳定又效率高,但需要辅助空间TR[1....n]

二路归并得核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列

(注意这就是线型表中我们常考的那个,两个有序链表合成一个新的有序表)

算法描述如下:

void Merge(RcdType SR[],RcdType&TR[],int i,int m,int n)

//将有序的SR[i...m]和SR[m+1....n]归并为有序的TR[i....n]

{

for(j=m+1,k=i; i<=m&&j<=n; ++k) //谁小就先将谁放进TR

{ if(SR[i].key<=SR[j].key)

TR[k]=SR[i++];

else

TR[k]=SR[j++];

}

if(i<=m) //将剩余的SR 直接放到TR

TR[k....n]=SR[i...m];

if(j<=n) //将剩余的SR 直接放到TR

TR[k...n]=SR[j....n];

}

void MSort(RcdType SR[], RcdType&TR1[], int s, int t)

{ //将SR[s...t]归并排序为TR1[s...t]

if(s= =t) //只有一个元素

TR1[s]=SR[s];

else

{

m=(s+t)/2;//将SR[]平分为两半

MSort(SR, TR2, s, m);

MSort(SR, TR2, m+1, t);

Merge(TR2, TR1, s, m, t);

}

更多考研复习资料汇总整理:

<P><A href="http://www.kyjxy.com/yingyu/zhenti/">考研英语历年真题</A></P>
<P><A
href="http://www.kyjxy.com/zhuanshuo/">专硕和学硕的区别</A></P>
<P><A
href="http://www.kyjxy.com/shuxue/ziliao/">考研数学复习计划</A></P>

时间: 2024-10-21 01:45:18

2016计算机考研:数据结构常用算法精析的相关文章

数据结构常用算法

//汉诺塔 void Hanoi(int n,string A,string B,string C){ if(n == 1) cout<<A<<"->"<<C<<endl; else{ Hanoi(n-1,A,C,B); cout<<A<<"->"<<C<<endl; Hanoi(n-1,B,A,C); } } //递归实现 int maxNUm(int nu

关于计算机考研方面的一些分享

这里写一点关于自己考研的经历.本人江苏普通二本工科狗一枚,本想着报考一所双一流来场逆袭,但最后还是退缩了.最后定的学校是上海某普通一本,专硕计算机技术专业,虽然不是双一流但位置在上海,从各方面来说感觉考取的概率会大一点. 2-6月阶段:关于数学,我备考的是数学二,一个是觉得自己能力不足以消化数学一所有知识点,第二点是因为觉得内容少可以节省时间.(当然,其实从这几年考研情况来看,反而选数学二会更吃力,因为大部分人都选的数学二,从而导致你很难在数学二中拔尖取得优势高分,而选数学一的人只要复习时间堆上

2016考研计算机考研备考书籍推荐

之所以会系统的推荐书籍,是因为自考研计算机专业课变成统考科目之后,计算机专业课统考便不再指定教材.为了让考研考生们能在找复习书籍的时候不走弯路,在此给大家推荐四组一共八本考研书籍. 数据结构方面的: 1. 教材:<数据结构>(严蔚敏,清华大学出版社) 2. 辅导书:<算法与数据结构考研试题精析(第二版)>(机械工业出版社) 操作系统方面的: 1. 教材:<计算机操作系统(修订版)>(汤子瀛,西安电子科技大学出版社) 2. 辅导书:<操作系统考研辅导教程(计算机专业

2016大连理工大学计算机考研经验

2016考研成绩已出,本人报考大连理工大学计算机科学与技术(本科也在大连理工),初试总分387排名第一,政治64,数学114,英语78,数据结构和计算机组成原理131.这个分数并不算高,现在记下本人复习的全过程,只为抛砖引玉,希望能给大家一点启发. 1.复习流程 数学: 114分不算高但也不算低,16数学有些偏难,手滑错了俩选择俩填空,后边错了半道线代和半道概率和四分之一道高数.复习时之前10年真题基本都在140左右.我们班有一个真题基本都在150的最后考了122. 第一个阶段,从3月开学开始到

2016计算机专业考研:c++大学教程第二版目录(上)

2016计算机专业考研:c++大学教程第二版目录,本文为上半部分,专业课的复习,读书很重要: 第1章计算机与C++编程简介 1.1 简介 1.2 什么是计算机 1.3计算机组成 1.4 操作系统的变革 1.5 个人计算.分布式计算与客户/服务器计算 1.6 机器语言.汇编语言和高级语言 1.7 C语言与C++的历史 1.8 C++标准库 1.9 Java.Internet与万维网 1.10 其他高级语言 1.11 结构化编程 1.12 典型C++环境基础 1.13 C++与本书的一般说明 1.1

计算机软考笔记之《数据结构与算法》

1.线性结构 (1)线性表 ①线性表的定义 ②线性表的存储结构 ③线性表的应用 (2)栈和队列 ①栈 ②队列 (3)串 ①串的定义及基本运算 ②串的存储结构 2.数组和矩阵 (1)数组 (2)矩阵 3.树和图 (1)树 ①树的定义 ②二叉树的定义和基本运算 ③二叉树的性质 ④二叉树的存储结构 ⑤二叉树的遍历 ⑥最优二叉树 ⑦二叉查找树 (2)图 ①图的定义及术语 ②图的存储结构 4.常用算法 (1)算法概述 ①算法的基本概念 ②算法与数据结构 ③算法的描述 ④算法效率 (2)排序算法 ①排序的基

常用数据结构及算法C#实现

常用数据结构及算法C#实现 1.冒泡排序.选择排序.插入排序(三种简单非递归排序) 1 int[] waitSort = { 1,0, 12, 13, 14, 5, 6, 7, 8, 9, 10 }; 2 3 //冒泡排序 4 int length = waitSort.Length; 5 6 for (int i = 0; i < length; i++) 7 { 8 for (int j = i + 1; j < length; j++) 9 { 10 if (waitSort[j] &g

java常用的数组、字符串、集合操作以及数据结构与算法基本知识

java中常用封装的数组 .字符串. 集合来操作对象,但数据结构中常用的有栈和队列   数与图以及他们之间的排序,查找. 数组声明没有分配内存空间  只有创建或者是初始化时才分配,创建时把数组中的数据类型数据所在的内存空间首地址赋值给数组名,在创建每个对象时,都会给该对象分配地址和它存储的数据 .如变量    int arr[]; int arr[]={1,2,3};  arr=new int[10] ,int arr[][]={{1,9,7},{1,2,3}}  int arr[][]=new

常用数据结构和算法操作效率的对比总结

前面介绍了经典的数据结构和算法,这一节我们对这些数据结构和算法做一个总结,具体细节,请参见各个章节的详细介绍,这里我们用表格来呈现它们的效率. 1. 数据结构部分 数据结构中常用的操作的效率表 通用数据结构 查找 插入 删除 遍历 数组 O(N) O(1) O(N) - 有序数组 O(logN) O(N) O(N) O(N) 链表 O(N) O(1) O(N) - 有序链表 O(N) O(N) O(N) O(N) 二叉树 O(logN) O(logN) O(logN) O(N) 二叉树(最坏)