北工大(数据结构)11-DSch8sort
2001年北京工业大学数据结构试题及答案

if ④填空 then exit(error); s:=q^.next; q^.next=s^.next; e:=s^.key; ⑤填空; /*维护*/ dispose(s) end; func find(p:link; e:elemtype):integer: q:link; I:integer; begin q:=p^.next; ⑥填空; q:=q^.next; I:=1; while ⑦填空 do [q:=q^.next; I:=I+1]; if (q=p^.next) then return (0) else return(i) end; /*循环条件中只有一Байду номын сангаас比较*/
C 语言
Void ins(link &p,int I,elemtype e) { int j; link q,s;q=p->next; j=0; while (q!=p && j<I-1){q=q->next; j++;} if (②填空 ) exit(error) s=(link)malloc(sizeof(node)); s->key=e; s->next=q->next=s; q->next=s;/*维护*/ ③填空 return; } void del(link &p,int I,elemtype &e) { int j; link q,s; q=p->next j=0; while (q!=p &&j<I-1){q=a->next; j++;} if (④填空 )exit(error) s=q->next; q->next=s->next; e=s->key;/*维护*/ ⑤填空 free(s); return; } find (link p,elemtype e) { int I; link q; q=p->next;⑥填空; q=q->next; I=1; while (⑦填空 ) {q=q->next; I++;} if (q=p->next) return 0; else return I; } /*循环条件中只有一次比较*/
北京工业大学十套数据结构试题及答案

已知一个图的顶点集 V 和边集 E 分别为:V={1,2,3,4,5,6,7}; E={(1,2)3,(1,3)5,(1,4)8,(2,5)10,(2,3)6,(3,4)15, (3,5)12,(3,6)9,(4,6)4,(4,7)20,(5,6)18,(6,7)25}; 用克鲁斯卡尔算法得到最小生成树,试写出在最小生成树中依次得到的各条边。 4. 画出向小根堆中加入数据 4, 2, 5, 8, 3 时,每加入一个数据后堆的变化。 四、阅读算法(每题 7 分,共 14 分) 1. LinkList mynote(LinkList L) {//L 是不带头结点的单链表的头指针 if(L&&L->next){ q=L;L=L->next;p=L; S1: while(p->next) p=p->next; S2: p->next=q;q->next=NULL; 3. L; } 请回答下列问题: (1)说明语句 S1 的功能; (2)说明语句组 S2 的功能; (3)设链表表示的线性表为(a1,a2, …,an),写出算法执行后的返回值所表示的线性 表。 2. void ABC(BTNode * BT) { if BT { ABC (BT->left); ABC (BT->right); cout<<BT->data<<' '; } } 该算法的功能是:
数据结构试卷(二)
一、选择题(24 分) 1.下面关于线性表的叙述错误的是( ) 。 (A) 线性表采用顺序存储必须占用一片连续的存储空间 (B) 线性表采用链式存储不必占用一片连续的存储空间 (C) 线性表采用链式存储便于插入和删除操作的实现 (D) 线性表采用顺序存储便于插入和删除操作的实现 2.设哈夫曼树中的叶子结点总数为 m,若用二叉链表作为存储结构,则该哈夫曼树中总共 有( )个空指针域。 (A) 2m-1 (B) 2m (C) 2m+1 (D) 4m 3.设顺序循环队列 Q[0:M-1]的头指针和尾指针分别为 F 和 R,头指针 F 总是指向队头元素 的前一位置,尾指针 R 总是指向队尾元素的当前位置,则该循环队列中的元素个数为 ( ) 。 (A) R-F (B) F-R (C) (R-F+M)%M (D) (F-R+M)%M 4.设某棵二叉树的中序遍历序列为 ABCD,前序遍历序列为 CABD,则后序遍历该二叉树 得到序列为( ) 。 (A) BADC (B) BCDA (C) CDAB (D) CBDA 5.设某完全无向图中有 n 个顶点,则该完全无向图中有( )条边。 2 2 (A) n(n-1)/2 (B) n(n-1) (C) n (D) n -1 6.设某棵二叉树中有 2000 个结点,则该二叉树的最小高度为( ) 。 (A) 9 (B) 10 (C) 11 (D) 12 7.设某有向图中有 n 个顶点,则该有向图对应的邻接表中有( )个表头结点。 (A) n-1 (B) n (C) n+1 (D) 2n-1 8.设一组初始记录关键字序列(5,2,6,3,8),以第一个记录关键字 5 为基准进行一趟快 速排序的结果为( ) 。 (A) 2,3,5,8,6 (B) 3,2,5,8,6 (C) 3,2,5,6,8 (D) 2,3,6,5,8
北京工业大学数据结构课设_理发馆报告

理发馆学号_____110703xx___ 姓名_____xxx______ 指导教师______xx______2013年10月目录1 需求分析3 1.1程序功能介绍 3 1.2程序数据要求 3 1.3 开发与运行环境需求 41.4 用户界面设计 52 数据结构设计7 2.1 主要数据结构7 2.2 程序整体结构112.3 模块功能描述113 详细设计124 测试22 4.1 正确运行示例224.2 错误运行示例245 总结提高251需求分析1.1程序功能介绍本程序模拟理发馆一天的经营状况,理发馆的环境如下:1.理发馆有N把理发椅,可同时为N位顾客进行理发(2<N<9);2.理发师按技术水平分为三个等级(一级最高,三级最低),对应不同的服务收费。
理发馆一天的工作过程如下:1.顾客进门时,需要选择某级别的理发师,只要该级别的理发师有空椅,则可立即坐下理发,否则需排队等候;2.一旦该级别的理发师有顾客理发完离去,排在该位理发师队列队头的顾客便可以开始理发。
理发馆老板统计每天不同级别理发师的营业时间、创收和每天理发馆总创收,并写入文本文件中,可作为理发师工资与奖金的发放依据。
1.2程序数据要求1.2.1输入数据(由文本文件输入):7 :3061 12 13 24 35 26 30.6数据说明:第一行的09:30表示理发馆将于九点半开门;第二行的6表示理发馆有6理发椅(此处可输入3~9的任意值);随后的N行:表示第i椅子的理发师的级别(如:第1理发椅是1级理发师,第2理发椅是1级理发师…)。
最后一行的0.6代表折扣(可选)1.2.2随机数据需求:每个顾客进门时将负责生成三个随机数:1)理发时间durtime:进门顾客理发所需服务时间;2)间隔时间intertime:该顾客与下一位顾客到达的时间间隔;3)服务选项select:该顾客选择理发师的级别。
由随机数函数产生。
1.2.3输出数据(输出到文本文件中):本日账目清单===============================按理发师===============================理发师编号:1 级别:1 工作时长:17 本日盈收:17理发师编号:2 级别:1 工作时长:29 本日盈收:29理发师编号:3 级别:2 工作时长:28 本日盈收:14理发师编号:4 级别:3 工作时长:73 本日盈收:23理发师编号:5 级别:2 工作时长:24 本日盈收:12理发师编号:6 级别:3 工作时长:27 本日盈收:9理发师编号:7 级别:3 工作时长:20 本日盈收:6理发师编号:8 级别:1 工作时长:30 本日盈收:30================================按级别===============================1级别理发师总工时:76 总收入:762级别理发师总工时:52 总收入:263级别理发师总工时:120 总收入:38=================================总汇=============================== 本日总创收:1401.3开发与运行环境需求1.3.1开发环境:Visual studio 20101.3.2运行环境:Win xp/Win 7/Win 81.4用户界面设计1.4.1初始化界面(例:6个队列)8队列界面1.4.2顾客到达、理发及等待界面1.4.3顾客离开界面1.4.4 DOS/GUI同步演示程序过程1.4.5折扣选择界面2数据结构设计2.1 主要数据结构2.1.1事件类(Event)//事件类:包含事件发生时间,事件类型,和下一个事件(指针)三个数据成员class Event {public:int occurtime;int event_type;Event* next_event;Event() {}Event(int occurtime, int event_type): occurtime(occurtime),event_type(event_type), next_event(NULL) {}~Event() {}};2.1.2事件表(EventList)//事件表类:数据成员:头指针,两个用于插入删除事件结点的指针,和事件表长度class EventList {public:Event *head, *ptr_before, *ptr_after;int length; //事件表长度EventList(){head = new Event(-1, -1);length=1;}~EventList() {}void OrderIn(Event* new_in);int ListEmpty();int Cmp(Event* new_in, Event* t1) ;};2.1.3顾客类(Customer)class Customer {public:int durtime;int select;Customer* next;Customer(): select(-1) {}Customer(int durtime, int select): durtime(durtime), select(select), next(NULL) {}~Customer() {}};2.1.4顾客队列类(CustomerQueue)class CustomerQueue {public:Customer *front, *rear;int select;int length;int worktime;int money;CustomerQueue(): front(NULL), rear(NULL), select(-1), length(0), money(0), worktime(0) {}~CustomerQueue() {}void EnQueue(Customer* add);void DelQueue();};2.1.5随机函数类(Random):class Random {public:int durtime;int intertime;int select;Random() {srand((int)time(NULL));}~Random() {}int Durtime();int Intertime();int Select();};2.1.6文件操作类(FileOperation):class FileOperation {public:int input_time[2];//接收输入时间小时、分钟char maohao;//接收中间的冒号int number[11];//用于接收理发师编号信息int chairs;//理发师人数float discount;//折扣(可选)char zhekou;FileOperation(): discount(1.0) {}~FileOperation() {}void FileInput(ifstream &from_file, int &opentime, CustomerQueue cq[], int&closetime);void FileOutput(ofstream &to_file, CustomerQueue cq[], int& total_money); };2.1.7绘图类(barbergraph):class barbergraph {public:IMAGE background_img;//顾客去背景图片IMAGE baber_desk;//理发师桌子背景IMAGE my_clock;//时钟背景IMAGE door;//门char now_time[10];//时钟信息存储char barber_info[20];//理发师信息char graphic_symbol[15];//图例信息Customer* p;//获取当前动作顾客int chairs;//获取理发师人数barbergraph() {//读取背景图片集loadimage(&background_img, _T("背景1.jpg"));loadimage(&baber_desk, _T("六桌子.jpg"));loadimage(&my_clock, _T("时钟.jpg"));loadimage(&door, _T("门.jpg"));}void set_chairs (int chairs);//初始化理发师人数void CommonGraph(CustomerQueue cq[], int opentime);//通用绘图界面void BarberGraph(CustomerQueue cq[],int opentime);//无事件状态界面void ArriveBarberGraph(CustomerQueue cq[], int arrival, int nowtime);//顾客到来界面void DepartBarberGraph(CustomerQueue cq[], int departure, int nowtime);//顾客离开界面~barbergraph() {}};2.1.8理发馆类(Barbershop):class BarberShop {public:EventList ev;//事件表CustomerQueue cq[11];//六个顾客队列1~10可选int opentime;//开门时间Event* cur_event;//当前事件Event* new_event;//初始事件Customer* new_customer;//新顾客指针int closetime;//TODO:目前为调试数据(22:00理想,未实现)int total_money;//理发馆一天总收入int chairs;//接收理发师人数BarberShop(): cur_event(NULL), new_customer(NULL), total_money(0) {}void OpenForDay(barbergraph &bg, int chairs);//开门初始化函数int Minimum(int select);//求同级别最短队列函数void CustomerArrived(Random &ran, barbergraph &bg);//顾客到来void CustomerDeparture(barbergraph &bg);//顾客离开void BarberSimulation(Random &ran, barbergraph &bg, int chairs);//事件驱动模型~BarberShop() {}};2.2 程序整体结构2.3 模块功能描述2.3.1 Event :作为EventList 的结点元素,数据:事件类型、事件发生的时间2.3.2 EventList :事件表,为有序表。
北京化工大学842数据结构2014年考研专业课真题试卷

C.相同结点数下高度最大 D.相同高度下结点数最多 66. 对一棵完全二叉树按层次遍历序进行递增编号,根结点编号为 0, 那么编号为 46 的结点的右子结点的编号是: A. 91 B. 92 C. 93 D. 94 67. 已知一棵二叉排序树的前序遍历序为(5, 3, 2, 1, 4, 6, 7), 则其后序遍历序为: A. (2, 1, 3, 4, 5, 6, 7) B. (1, 2, 4, 3, 7, 6, 5) C. (1, 2, 3, 4, 5, 6, 7) D. (1, 2, 4, 3, 7, 5, 6) 68. 若已知长度不少于 1000000 的待排序序列为有序序列, 则以下排 序方法中效率最高的是: A. 直接插入排序 B. 归并排序 C. 快速排序 D. 堆排序 69. 平衡二叉树上所有结点的平衡因子: A. 小于 1 B. 大于 1 C. 大于 0 D. 小于 2 70. 若一棵二叉树中有 31 个叶结点, 则该二叉树中度为 2 的结点的个 数是 A. 30 B. 31 C. 32 D. 不确定 71. 存储矩阵的三元组表法的特点是: A. 比二维数组结构节省空间 B. 按照行列有序排列 C. 矩阵计算速度慢 D. 同列非零元排列在一起 72. 设有一个 4 维数组,各维长度为 A[4][7][3][5],按行优先顺 序排列,则数组下标(1, 3, 2, 1)的物理下标(下标起始值均 从 0 开始)是: A. 35 B. 70 C. 161 D. 177 73. m 阶 B-树的根结点最少有几个关键字: A. 1 B. 2 C. ┌m/2┐ D. └m/2┘ 74. 已知 7 个城市(分别编号为 0~6)之间修建道路的耗费分别为:
精都教育——全国 100000 考生的选择
我们的梦想,为成就更多人的梦想
北方工业大学数据结构复习材料(选择、判断、简答、计算)

A. n-i B. n-i+1
C. n-i-1 D. i
5. 若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则
利用( )存储方式最节省时间。
A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表
6. 设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用( )最节省时间。
北方工业大学
《数据结构》课程期末复习材料
(2016-2017 学年度)
一、 选择(填空)题(第一、二、三章)...........................................................................1 二、 选择(填空)题(第四、五、六章)...........................................................................3 三、 选择(填空)题(第七、九、十章)...........................................................................4 四、 判断题(第一、二、三章)...........................................................................................5 五、 判断题(第四、五、六章)...........................................................................................6 六、 判断题(第七、九、十章)...........................................................................................6 七、 计算简答题(第二章)...................................................................................................7 八、 计算简答题(第三章)...................................................................................................9 九、 计算简答题(第四章).................................................................................................10 十、 计算简答题(第六章).................................................................................................11 十一、 计算简答题(第七章).............................................................................................12 十二、 计算简答题(第九章).............................................................................................15 十三、 计算简答题(第十章).............................................................................................16 答案解析......................................................................................................................................... 18
北工大(数据结构)11-DSch2-List

插入时逻辑结构的变化: <Kp-1,Kp><Kp-1,value>、<value,Kp>
为了保证逻辑上相邻的元素物理上也相邻, 除非 p=n,否则必须移动第p个及后面的元素
插入算法思想
需要考虑
插入位置是否合理?是否有空间?
插入动作:移动、插入、修改长度 算法步骤: 验参(若表已满、插入位置不合法):失败退出 第n-1到第p个元素(共n-p个 )后移一位(腾空间)
删除元素
k0 k1 k2
kp-1 kpkp+1...Kn-1 ...
左移n-1-p个
k0 k1 k2 9 3 5 8 2 7 9 3 8 2 7
kp-1kp+1 ... Kn-1…
逻辑结构变化 <kp-1,kp> <kp,kp+1> <kp-1,kp+1>
3、顺序表的删除
template <class T> //算法描述 bool arrList<T>:: del(const int p){ //删除顺序表aList中位置p的元素 if (curLen <=0){ //验参 cout<<“No element to delete\n”<<endl; return false; } if (p<0|| p>curLen-1){ cout<<“deletion is illegal \n”<<endl; return false; } for( int i=p; i< curLen -1; i++ ) aList[i] = aList[ i+1]; //从前向后(p..n-1)处理,每个元素左移一步 curLen--; //表长-1 return true; } 算法分析: T( n) = O(n) 基本操作:移动; 最好:0次(删表尾);最差:n-1次(删表头); 平均:i=1i=n pi*(n-i) = i=1i=n (1/n) *(n-i )=(n-1)/2
2022年北方工业大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)

2022年北方工业大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)一、选择题1、将线性表的数据元素进行扩充,允许带结构的线性表是()。
A.串B.树C.广义表D.栈2、将两个各有N个元素的有序表归并成一个有序表,其最少的比较次数是()。
A.NB.2N-1C.2ND.N-13、静态链表中指针表示的是()。
A.下一元素的地址B.内存储器的地址C.下一元素在数组中的位置D.左链或右链指向的元素的地址4、循环队列A[0..m-1]存放其元素值,用front和rear分别表示队头和队尾,则当前队列中的元素数是()。
A.(rear-front+m)%mB.rear-front+1C.rear-front-1D.rear-front5、有六个元素6,5,4,3,2,1顺序入栈,下列不是合法的出栈序列的是()。
A.543612B.453126C.346521D.2341566、若一棵二叉树的前序遍历序列为a,e,b,d,c,后序遍历序列为b, c,d,e,a,则根结点的孩子结点()。
A.只有e B.有e、b C.有e、c D.无法确定7、排序过程中,对尚未确定最终位置的所有元素进行一遍处理称为一趟排序。
下列排序方法中,每一趟排序结束时都至少能够确定一个元素最终位置的方法是()。
Ⅰ.简单选择排序Ⅱ.希尔排序Ⅲ.快速排序Ⅳ.堆排Ⅴ.二路归并排序A.仅Ⅰ、Ⅲ、Ⅳ B.仅Ⅰ、Ⅱ、Ⅲ C.仅Ⅱ、Ⅲ、Ⅳ D.仅Ⅲ、Ⅳ、Ⅴ8、有关二叉树下列说法正确的是()。
A.二叉树的度为2B.一棵二叉树的度可以小于2C.二叉树中至少有一个结点的度为2D.二叉树中任何一个结点的度都为29、设X是树T中的一个非根结点,B是T所对应的二叉树。
在B中,X是其双亲的右孩子,下列结论正确的是()。
A.在树T中,X是其双亲的第一个孩子B.在树T中,X一定无右兄弟C.在树T中,X一定是叶结点D.在树T中,X一定有左兄弟10、对序列{15,9,7,8,20,-1,4}用希尔排序方法排序,经一趟后序列变为{15,-1,4,8,20,9,7}则该次采用的增量是()。
2019 北京工业大学 896《数据结构》考试大纲

2019年北京工业大学896《数据结构》考试大纲一、考试要求数据结构考试大纲适用于北京工业大学信息学部(085211)计算机技术(专业学位)领域的硕士研究生招生考试。
数据结构课程是计算机技术领域(专业学位)的重要基础课。
考试内容主要包括基本数据结构、排序、索引、检索、高级数据结构等内容,从逻辑结构的角度包括线性表、栈、队列、二叉树、树和图等各种基本数据结构;从算法的角度包括各类排序、检索和索引算法。
要求考生对其中的基本概念有很深入的理解,掌握数据结构与算法的基本概念、合理组织数据的基本方法、高效处理数据的基本算法、并具备面对实际问题选择恰当数据结构与相应算法的能力。
二、考试内容1.数据结构的相关概念、算法概念、算法性质及算法分析(时间复杂度与空间复杂度);2.线性表逻辑结构定义、存储结构的表示,以及在特定存储结构下线性表基本运算的算法实现;3.栈与队列的逻辑结构定义、存储结构的表示,基本操作特点,栈与队列的基本应用;4.串的逻辑结构定义,基本操作的含义与实现;5.数组定义及其顺序存储,矩阵的压缩存储,广义表定义及存储结构;6.树的定义与存储结构,二叉树的定义与性质、存储结构,二叉树遍历算法(三序遍历与按层遍历),赫夫曼树与赫夫曼编码以及二叉树基本算法的实现与应用;7.图的定义与术语,图的存储结构,图的遍历(深度优先搜索与广度优先搜索),最小生成树、拓扑排序以及最短路径的求解;8.查找的相关概念,静态查找表(顺序表的查找与有序表的查找),动态查找表(二叉排序树),B-树,B+树,AVL 树,哈希表的相关概念;9.排序的相关概念,掌握插入排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序等算法的执行过程、时空复杂度、稳定性以及使用场合。
三、参考书目1.严蔚敏吴伟民.《数据结构》(C 语言版),清华大学出版社,2011。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8.2.2 Shell排序 算法分析
不稳定 空间代价:O(1) 时间代价:O(n2) 选择适当的增量序列,可使时间代价接近O(n) 增量序列的选择 增量每次除以2递减,时间代价为O(n2) 增量序列为{2k-1,2k -1 -1,…,7,3,1} 时,时 间代价为O(n3/2) 选取其他增量序列还可能更进一步减少时间代价
8.2.2 Shell排序
直接插入排序的两个性质:
在最好情况(序列本身已是有序的)下时间代 价为Θ(n) 对于短序列,直接插入排序比较有效
Shell排序有效地利用了直接插入排序的这两 个性质 。
8.2.2 Shell排序
算法思想:
先将序列转化为若干小序列,在这些小序列内进行插 入排序; 逐渐扩大小序列的规模,而减少小序列个数,使得待 排序序列逐渐处于更有序的状态, 最后对整个序列进行扫尾直接插入排序,从而完成排 序。
8.2.1 直接插入排序[算法8.1]
template <class Record> void InsertSorter(Record Array[ ], int n ){ //直接插入排序,n个待排记录存于Array Record TempRecord; //临时变量……… S(n) =O(1) int i , j; for ( i=1; i<n; i++){ TempRecord =Array[ i ]; //待插入记录 j =i-1; //j指有序表表尾 while ( j >= 0 && TempRecord < Array[ j ]){ //比较 Array[ j+1 ] =Array[ j ]; //若待插值小,移动 j =j-1; } //下标左移,继续比 Array[ j+1] = TempRecord; } }; //待插就位j+1
8.3.1 直接选择排序[算法8.3]
堆定义 (p120 ch5.5.1) :
8.3.2 堆排序
n个元素的序列{k1,k2,...kn},满足以下关系时,称堆 k i <= k 2i or k i >= k 2i k i <= k 2i+1 k i >= k 2i+1 i=1,2,..n/2 最小堆 最大堆 存储结构:序列存储在一维数组 用“完全二叉树” 图示用“一维数组存储”的堆
直接插入排序举例
初始:R(49),R(38),R(65),R(97),R(76),R(13),R(27),R(49) 有序表:R(49) 第2趟:R(38),R(49),... 第3趟:R(38),R(49),R(65),... 第4趟:R(38),R(49),R(65),R(97),... 第5趟:R(38),R(49),R(65),R(76),R(97),… 第6趟:R(13),R(38),R(49),R(65),R(76),R(97),… 第7趟:R(13),R(27),R(38),R(49),R(65),R(76),R(97),. 第8趟:R(13),R(27),R(38),R(49),R(49),R(65),R(76),R(97)
直接插入排序算法分析
1.空间:一个辅助空间(TempRecord临时存放待插记录) 2.时间:2层循环,外层n-1趟,内层次数与输入数据有关 最好(正序):O(n) 如1 3 5 7 9
每趟比较1次,共比较n-1次,当前记录入出临时变量,移动2(n-1)次
最坏(逆序): O(n2)
如 ( 9) 7 5 3 1
堆排序算法分析 不稳定 T(n)=Θ(nlog n) 建堆:Θ(n) 删除堆顶:Θ(log n) S(n)=Θ(1)
一次建堆 ,n次删除堆顶
8.4 交换排序 p204
基本思想: 两两比较,发现错位则交换,直至没错位 8.4.1 冒泡排序
“正序”序列 :待排序序列正好符合排序要求
“逆序” 序列 :把待排序序列逆转过来,正好符 合排序要求 “稳定的”(stable)排序算法 :如果存在多个具有 相同排序码的记录,经过排序后这些记录的相对 次序仍然保持不变 。
ቤተ መጻሕፍቲ ባይዱ
插入排序 直接插入排序 Shell排序(Shell sort) 交换排序 冒泡排序(Bubble sort) 快速排序(Quicksort) 选择排序 直接选择排序(Selection sort) 堆排序(Heapsort) 归并排序(Mergesort) 分配排序(Binsort) 桶排序 基数排序 索引排序
第i趟
( 7 9 ) 第2趟结果
外层第i趟: 从第i-1到第0个,比较i次 移动 i+2次(第i-1到第0个,临时变量入出各一次)
i=2..n,共进行n-1趟 共比较 i=1n-1 i = (n+2)(n-1)/2次, 移动 i=in-1( i+2)= (n+4)(n-1)/2次
平均
7
[算法8.2]“增量每次/2递减”的Shell排序 2/2
template <class Record> ModInsertSort(Record Array[ ],int n, int delta) { // 对子序列中第i个记录排序 for (int i=delta; i<n; i+=delta) for (int j= i; j >=delta; j-=delta){ //j>=delta才继续 if ( Array[ j] < Array[j-delta])) //错位 swap(Array, j, j-delta); //交换,继续 else break; //正序,不必再比,退出内层for } }
排序的目的就是将R中的记录按照特定的顺序重新排列, 形成一个新的有序序列R’= {r’1, r’2, …,r’n}
相应排序码为k’ ={k’1, k’2, …,k’n}
其中k’1≤k’2≤…≤k’n或k’1≥k’2≥…≥k’n ,前者称为不减序, 后者称为不增序。
8.1基本概念
内排序(Internal Sorting):整个排序过程中所有的 记录都可以直接存放在内存中 外排序(External Sorting):内存无法容纳所有记 录,排序过程中还需要访问外存
关键码(Key):唯一确定记录的一个或多个域
排序码(Sort Key):作为排序运算依据的一个或多个域 序列(Sequence):由待排记录组成的集合 排序(Sorting) — 将序列中的记录按照排序码特定的顺序 排列起来,即排序码域的值具有不减(或不增)的顺序
给定序列R ={r1, r2, …,rn}其排序码为k ={k1, k2, …,kn}
8.1 基本概念 8.2 插入排序
直接插入排序 Shell排序
第8章 内排序
8.3 选择排序
直接选择排序 堆排序
8.4交换排序
冒泡排序 快速排序
8.5 归并排序 8.6 分配排序和索引排序 8.7 排序算法的时间代价
8.1基本概念 p194
记录(Record):结点,进行排序的基本单位
增量d递减
[算法8.2]“增量每次/2递减”的Shell排序 1/2 template <class Record > 0 1 2 3 4 5 6
void ShellSort( Record Array[ ], int n){ { int i, delta; for ( delta=n/2; delta>0; delta/=2) //分别对delta个子序列排序 for (int i =0; i <delta; i++) ModInsSort(&Array[i], n-i, delta); } n=8 外层for delta=4 内层for i=0..3 第1次ModInsSort(A[0],8,4) A[0]A[4] 第2次ModInsSort(A[1],7,4) A[1]A[5] 第3次ModInsSort(A[2],6,4) A[2]A[6] 第4次ModInsSort(A[3],5,4) A[3]A[7] 外层for delta=2 内层for i=0..1 第1次ModInsSort(A[0],8,2) A[2]比A[0],A[4]比[2],A[6]比A[4] 第2次ModInsSort(A[1],7,2) A[3]比A[1],A[5]比A[3],A[7]比A[5]
排序算法的分类
排序算法的衡量标准
时间代价:记录的总比较和总移动次数
一次swap交换导致3次移动
时间代价分3种:
最小时间代价 最大时间代价 平均时间代价
空间代价
8.2 插入排序(Insert Sorting)
算法思想: 逐个处理待排记录,每个新记录都要与 前面那些已排好序的记录进行比较,然 后插入到适当的位置,得到一个新的、 记录数增 1的有序表。 8.2.1 直接插入排序 8.2.2 Shell排序
比较:
直接选择排序:直接从剩余记录中线性查找最小记录 堆排序:利用堆结构保持记录相对大小信息,效率更高
堆排序步骤: 建立最大堆 首尾交换(最大存最后),堆元素个数-1,对根筛选, 重复直至堆剩1个元素
1.初始建堆结果