6种排序-数据结构(大连理工)

时间:2024.5.4

#include<iostream>

#include<string>

#include<stack>

usingnamespacestd;

///////交换函数

bool swap(int *a,int *b)

{

int c=*a;

*a=*b;

*b=c;

return 1;

}

//////直接插入排序//////////////////

boolDerictSearchSort(int a[],intf,int e)

{

int* first=a+f;

int* end=a+e;

int n=e-f+1;

int temp;

int *temp_p;

for(inti=0;i<n;i++)

{

temp=*(first+i);

temp_p=first+i-1;

while(temp_p>=first&&temp<*temp_p)

{

int c=*temp_p;

*temp_p=*(temp_p+1);

*(temp_p+1)=c;

temp_p--;

}

}

return 1;

}

//////折半插入排序//////////////////

boolBinarySearchSort(int a[],intf,int e)

{

int* first=a+f;

int* end=a+e;

int n=e-f+1;

int temp;

int *temp_p;

for(inti=1;i<n;i++)

{

int* head=first;

int* tail=first+i-1;

int* p;

while(1)

{

if(head>=tail-1)break;

if(*(head+(tail-head)/2)>*(first+i))tail=(head+(tail-head)/2)-1;

elseif(*(head+(tail-head)/2)<*(first+i))head=(head+(tail-head)/2)+1; } if(*tail<*(first+i)){p=tail+1;} elseif(*head>*(first+i)){p=head;} else p=tail; while(p!=first+i) { int c=*p; *p=*(p+1); *(p+1)=c; } } return 1; } /////希尔排序//////////////////// boolShellSort(int a[],intf,int e) { int* head=a+f; int* tail=a+e; int n=e-f+1; int g=2;//每个序列的长度 while(g<=n) { int d=n/g;//起点的个数,步长 //// for(inti=0;i<d;i++) { int* first=head+i; int* end=tail; int temp; int *temp_p; temp_p=first+d; temp=*(temp_p+d); while(temp_p>=first&&tail>temp_p+d&&temp<*temp_p) { int c=*temp_p; *temp_p=*(temp_p+d); *(temp_p+d)=c; temp_p=temp_p-d; } } /// g=g*2; } return 1; } //////冒泡排序//////////////////// boolBubbleSort(int a[],intf,int e) { int* first=a+f;

int* end=a+e;

for(int* head=first;head<end;end--)

for(int* p=head;p<end;p++)

if(*p>*(p+1)){int c=*p;*p=*(p+1);*(p+1)=c;}

return 1;

}

//////快速排序//////////////////

boolFastSort(int a[],intf,int e)

{

if(f>=e)return 1;

int* first=a+f;

int* end=a+e;

int* tag=first;

while(first!=end)

{

if(first==tag&&*end<*first){swap(end,first);tag=end;first++;} elseif(first==tag&&*end>=*first){end--;}

}

FastSort(a,f,tag-a-1);

FastSort(a,tag-a+1,e);

return 1;

}

//////直接选择排序////////////

boolDerictChooseSort(int a[],intf,int e)

{

int* first=a+f;

int* end=a+e;

int n=e-f+1;

while(n!=1)

{

int *p=first;

int *tag=p;

while(p!=end+1)

{

if(*p<*tag)tag=p;

p=p+1;

}

int c=*first;

*first=*tag;

*tag=c;

n--;

first++;

}

return 1;

}

int main()

{

int a[10]={0,2,5,7,4,6,8,1,9,3};

DerictSearchSort(a,0,9);

for(inti=0;i<10;i++)cout<<" "<<a[i];

cout<<"\n";

} BinarySearchSort(a,0,9); for(inti=0;i<10;i++)cout<<" "<<a[i]; cout<<"\n"; ShellSort(a,0,9); for(inti=0;i<10;i++)cout<<" "<<a[i]; cout<<"\n"; BubbleSort(a,0,9); for(inti=0;i<10;i++)cout<<" "<<a[i]; cout<<"\n"; FastSort(a,0,9); for(inti=0;i<10;i++)cout<<" "<<a[i]; cout<<"\n"; DerictChooseSort(a,0,9); for(inti=0;i<10;i++)cout<<" "<<a[i]; cout<<"\n";


第二篇:数据结构重点整理


考点

1 算法的时间复杂度 (不会出简单的for循环)

例题.1下面程序段的时间复杂度为 D O(n*log2n) for (k=1;k<=j;k++)

{ int i=1; while (i<=n)

i=i*2; }

O(1)初始化线性表 检查线性表是否为空

O(n)删除线性表中的所有元素;得到线性表的长度;得到线性表中指定序号为pos的元素;遍历一个线性表;从线性表中查找具有给定值的第一个元素;更新线性表中具有给定值的第一个元素;向线性表中按给定条件插入一个元素;从线性表中删除符合给定条件的第一个元素

O(n^2)对线性表进行排序 2几种数据结构 (数据结构定义:具有结构的数据元素的集合 )

逻辑结构:集合、线性结构(线性表、广义表、堆栈和队列)非线性结构(树、图) 存储结构:顺序存储结构、链式存储结构、索引结构、散列结构等

集合和线性结构:1 :1 树形结构:1 :N 图形结构:N : N 3 线性表顺序存储和链接存储的特点

顺序存储:随机存取,预先定义表长;插入删除时有大量元素的移动(当下标为1开始的实话移动n-i+1,当下标为0开始的实话移动n-i),查找方便。

链式存储:非随机存取,表长不需要预先定义是动态分配,插入删除不需要大量的元素移动,查找时从第一个元素开始查找。

4 根据线性表的常用操作,选择最合适的存储方式

顺序表和链表的比较:

空间方面:a当表长难估较大时,选择链式存储b当表长较小时,选择顺序存储 时间方面:a插入与删除较多时选择链式存储b查找方面较多时用顺序存储

语言方面:当语言没有指针,选用链式存储时选用静态链表(静态链表需要预先设定空间)

某线性链表最常用的操作是在最后一个结点之后插入一个结点或删除第一个结点, 用仅有尾指针的单循环链表存储方式实现这两种操作

6 链表的特点

例题:链表不具有的特点是(A)。

A、可随机访问任意元素 B、插入删除不需要移动元素

C、不必事先估计存储空间 D、所需空间与线性表长度成正比

7 链表的插入删除

8 链表各操作的时间复杂度

O(1)初始化链表 检查链表是否为空

O(n)删除链表中的所有元素;得到链表的长度;得到链表中指定序号为pos的元素;遍历一个链表;从链表中查找具有给定值的第一个元素;更新线性表中具有给定值的第一个元素;向链表中按给定条件插入一个元素;从链表中删除符合给定条件的第一个元素 O(n2)对链表进行排序

例题:在一个长度为n单链表;在表头插入元素的时间复杂度为 O(1) ;在表尾插入元素的时间复杂度为O(n)。

9 栈的特点:先进后出,后进先出。

10 栈的顺序存储、链式存储的出栈入栈时间复杂度:O(1)

13 根据给定递归算法和输入 求输出

(读递归程序)

14 数组上的循环队列 的进队出队操作 (参考期中考试最后大题)

判空:rear == front 满:(rear+1)%MaxSize == front 进队操作:rear = (rear+1)%MaxSize; Q(rear)=x 出队操作:front = (front+1)%MaxSize; X=Q(front)

入队时需先修改入队指针(队尾指针)rear = = (rear +1)% QueueMaxSize 出队时需要修改队头指针front == (front +1)% QueueMaxSize 15 链队的插入O(1)

void EnQueue (LinkQueue& HQ,const ElemType& item) { LNode* newptr=new LNode; if (newptr ==NULL) { cerr<<“Memory alocation failure."<<endl; exit(1); } newptr->data=item; newptr->next =NULL; if (HQ.rear==NULL) HQ.front=HQ.rear=newptr; else HQ.rear=HQ.rear->next=newptr; }

17 稀疏矩阵的定义:其非零元素的个数远远小于零元素的个数。

稀疏矩阵的严格定义: 稀疏因子?=非零元素/所有元素个数 通常认为 ? ? 0.3 的矩阵为稀疏矩阵

三元组表示形式: ( i, j, value ) i为第i行, j为第j列,value为非0元素的值 18 广义表的特点

规定:大写字母表示广义表名称,小写字母表示原子,广义表非空时:a是广义表的表头head。其余元素组成表尾tail;

广义表中的数据元素有相对次序;广义表的长度定义为所含元素的个数;

广义表的深度定义为括号嵌套的最大次数;注意:“空表”的深度为 1 ; 广义表可以共享; 广义表可以是一个递归的表;递归表的深度是无穷值,长度是有限值。 例:D=(E, F) E=(a, (b, c), D) , F=(d, (e)) D的长度为2,深度为无穷 19 求广义表的长度 深度

广义表的深度=Max {子表的深度} +1;空表的深度 = 1;仅由单元素组成的表的深度 = 1 例LS=((),(e),(a,(b,c,d)))长度为3深度为3; LD=(((a),((),b),(c)))长度1深度4 20 树的性质1

树中结点个数等于所有结点的度数加1 21 二叉树的性质4 P185

书中性质4:

若对具有n个结点的完全二叉树按照层次从上到下,每层从

左到右的顺序进行编号, 则编号为i 的结点具有以下性质:

(1) 若编号为i的结点有左孩子,则左孩子结点的编号为2i;若编号为i的结点有右孩子,则右孩子结点的编号为2i+1.

(2) 除树根结点外,若一个结点的标号为i,则它的双亲结点的编号为i/2,也就是说,当i为偶数时,其双亲结点的编号为i/2,它是双亲结点的左孩子,当i为奇数时,其双亲结点的编号为(i-1)/2,它是双亲结点的右孩子. (3) 若i≦|_n/2_|,即2i ≦n,则编号为i的结点为分支结点,否则为叶子结点.

(4) 若n为奇数,则每个分支结点都既有左孩子,又有右孩子;若n为偶数,则编号最大的分支结点(编号为n/2)只有左孩子,没有右孩子,其余分支结点左、右孩子都有.

22 给定权值 构造哈夫曼树 求带权路径长度(参考作业题)

例题1:如右图:

WPL=7*1+5*2+2*3+4*3=35

23 哈夫曼树的特点

又称最优树,是一种带权路径长度WPL最 小的二叉树。

由0和1组成,用哈夫曼编码传送的电文长度;传输速率最快。 叶子结点的度为零;除叶子结点外的所有结点的度都为2

24 二叉排序树求平均查找长度:

K为层数,n表示最大层数,m(k)表示第k层有m结点个数, M表示所有结点个数。

/(M)

25 有向图边数和顶点入度 出度关系

在有向图的邻接表中,从一顶点出发的弧链接在同一链表中,邻接表中结点的个数恰为图中弧的数目,所以顶点入度之和为弧数和的一倍;在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的1倍;无向图的邻接表中结点个数的边数的2倍。 向图边数=所有度之和/2

26 无向图 顶点数和最小生成树的边数关系

无向图 顶点数n:最小生成树的边数n-1 27 图的邻接表P258

邻接表:是图的一种链式存储结构。在邻接表中,对图中每个顶点建一个单链表,第i个单链表中的结点表示依附于顶

点vi的边(对于有向图是以顶点vi为尾的弧)。 图的邻接表是存放什么的:

无权无向图:列存放所有节点,横向为结点对应邻接结点和指针指向结点对应的下一邻接点

带权有向图:列存放所有节点,横向为结点的出度的所有邻接点,其中第一项为结点名称,第二项为与该结点名称对应的权值,第三项为指针指向结点对应的下一出度邻接点。

28 求最短路径长度P281

两个顶点间可能存在多条路径,其中有一条是长度最短的路径,即最短路径

若带权值要i到j中所经过边权值之和最小的路径称为最短路径,其权值称为最短路径长度。

29 图的边数与顶点数的关系

(以下是网上找的小题)

30 1) 布里姆算法

依次在G中选择一条一个顶点仅在V中,另一个顶点在U中,并且权值最小的边加入集合TE,同时将该边仅在V 中的那个顶点加入集合U. 重复上述过程n-1次,使得U=V,此时T为G的最小生成树.

2) 克鲁斯卡尔算法

将图G中的边按权值从小到大的顺序依次选取,若选取的边使生成树T形成回路,则将其舍弃,如此进行下去,直到TE中包含有n-1条边为止,此时T为G的最小生成树.

31 顺序查找的平均查找长度:(1+2+3……n)/N 32 构造二叉排序树 求平均查找长度

平均查找长度为:(1*1+2*2+3*4+4*1)/8=21/8

33二分查找 给定有序表和待查元素 求依次与哪些元素进行比较

将数据元素2,4,6,8,10,12,14,16,18,20依次存放于一维数组A[0..9]中,然后采用二分查找方法查找元素12,被比较过的数组元素的下标依次为 4,7,5 _。 34冒泡排序 每趟需要进行的比较次数,最多进行多少趟 n-1趟 35 快速排序 第一次划分结果

快速排序(Quick Sorting),又称划分排序.是目前所有排序方法中速度最快的一种(从排序区间选取一个元素为基准,从区间两端向中间顺序进行比较和交换,使得前面单元只保留比基准小的元素,后面单元保留比基准大的元素.然后把基准放到前后两部分之间.)

36 各排序算法空间复杂度

排序方法 时间复杂度

平均情况 最坏情况 最好情况

直接插入 O(n2)

空间复杂稳定性 复杂性 度 O(1)

稳定 简单 不稳定 较复杂 稳定 简单

O(n2) O(n)

希尔排序 O(n*n1/2) O(n2) 冒泡排序 O(n2)

O(nlog2n) O(1) O(n)

O(1)

O(n2)

快速排序 O(nlog2n) O(n2) 直接选择 O(n2)

O(nlog2n) O(log2n) 不稳定 较复杂 O(n2)

O(1)

不稳定 简单 不稳定 较复杂 稳定 较复杂 稳定 较复杂

O(n2)

堆排序 O(nlog2n) O(nlog2n) O(nlog2n) O(1) 归并排序 O(nlog2n) O(nlog2n) O(nlog2n) O(n)

基数排序 O(d(n+rd)) O(d(n+rd)) O(d(n+rd)) O(rd)

37 二叉排序树的特点

二叉排序树的中序是有序的;左孩子比根小,右孩子大于等于根

38 顺序查找适合的存储结构

顺序查找方法既适用于线性表的顺序存储结构,也适用于线性表的链式存储结构(使用单链表作存储结构时,扫描必须从第一个结点开始)。

39排序算法时间复杂度 (见36知识点图) 40 双循环链表 (老师忘记出什么样的了) 41 图连通需要的边数

在n个顶点的无向图中,若边数>=n-1,则该图必是连通图。 42 排序的稳定性(见36知识点图)

稳定的有:直接插入 、归并排序、基数排序、冒泡排序 不稳定的有:快速排序、希尔排序、直接选择、堆排序

43 树的性质3

课件:性质3 深度为h的k叉树中至多有(k-1)/(k-1) 结点。

h

满k叉树:结点个数等于(k-1)/(k-1) 的k叉树。

递归定义:或者是一棵空树,或者是一棵由根结点和两棵互不相交的左、右子树组成的非空树。左、右子树同样也是二叉树。

h

44 二叉树的定义:二叉树为度为2的有序树。

45 二分查找 最多需要比较次数:N个元素最多比较n/2次 46树的深度的定义:树中所有结点层次的最大值,也称高度。

每次调整至少能排除一半的个数(从x到其x-1层,x层得个数应该是所有个数的一半+1),所以复杂度是log级别

比如有32个元素(为了方便取一个2的幂), 第一次排除 ,16,第二次,8,第三次4,... 2,1. 以这种规律排除几次才能完呢?

比如要排除a次,那么 第一次 2^(a-1) ,第二次2^(a-2)... 第三次2^(a-3) ....第a次2^0=1

是不是 总的个数-1= 1+2+4+...2^(a-1) =2^a-1 那么总的个数=2^a 所以: a=log2 (总的个数)

对于一棵具有n个结点的二叉树,用二叉链表存储时,其指针总数为_________ 2n ____个,其中_____ n-1__________个用于指向孩子,____________ n+1_____个指针是空闲的。

若对一棵完全二叉树从0开始进行结点的编号,并按此编号把它顺序存储到一维数组A中,即编号为0的结点存储到A[0]中。其余类推,则A[ i ]元素的左孩子元素为____2i+1____,右孩子元素为____ 2i+2 ___________,双亲元素为____(i-1)/2________。

6. 设一组初始记录关键字序列为(15,17,18,22,35,51,60),要求计算出成功查找时的平均查找长度。答: ASL=(1*1+2*2+3*4)/7=17/7

2.从一个长度为n的顺序表中删除第i个元素(0≤i≤n-1)时,需向前移动n-i+1个元素。 [ n-i-1 ]

(×)

1.在一个长度为n的顺序表中删除第i个元素时,需向前移动 n-i-1 个元素。插入i位置,移动 n-i个元素。

8.在一棵二叉树中,度为零的结点的个数为n0,度为2 的结点的个数为n2,则有

9.一棵有n个叶子结点的哈夫曼树共有__2n-1_个结点。

3、顺序查找查找成功时的最坏比较次数为(n-1)和查找失败时的比较次数为(n)。

4、设有64个元素,用折半查找方法进行查找时,最大比较次数是(7),最小比较次数是(1)。

只有非空的广义表的表尾永远是广义表 表头可以是原子也可以是子表

3.设某堆中有n个结点,则在该堆中插入一个新结点的时间复杂度为O(log2n)。(对 ) 一个n个顶点的无向连通图最多有n(n-1) /2 条边,最少有 n-1 条边。

8、用邻接表表示图进行广度优先遍历时,通常是采用(B队列) 来实现算法的。 9、用邻接表表示图进行深度优先遍历时,通常是采用 (A、栈) 来实现算法的。

6.在一个长度为n的顺序存储的集合中查找值为x的元素时,在等概率的情况下,查找成功时的平均查找长度为____________。

A n B n/2 C (n+1)/2 D (n-1)/2

9.n个节点的完全二叉树,编号为i的节点是叶子结点的条件是 D 。 A、i<n B、2*i<=n C、2*i+1>n D、2*i>n

5.下面程序段的时间复杂度为____________。

int i=1; while (i<=n) i=i*2; A O(n)

14. 对于长度为N的线性表,在最坏情况下,下列各种排序所对应的比较次数中正确的是______________。 A 冒泡顺序为N/2

B 冒泡顺序为N

B O(n1/2) C O(log2n) D O(n2)

C 快速排列为N D 快速排序为N(N+1)/2

.快速排序的时间复杂度为O(log2n) ×

.结点最少的树为只有一个结点的树 ×

.顺序存储的线形表可以随机存取 √

更多相关推荐:
数据结构排序超级总结

一插入排序InsertionSort1基本思想每次将一个待排序的数据元素插入到前面已经排好序的数列中的适当位置使数列依然有序直到待排序数据元素全部插入完为止2排序过程示例初始关键字493865977613274...

数据结构各种排序算法总结

数据结构各种排序算法总结计算机排序与人进行排序的不同计算机程序不能象人一样通览所有的数据只能根据计算机的quot比较quot原理在同一时间内对两个队员进行比较这是算法的一种quot短视quot1冒泡排序Bubb...

数据结构算法排序总结

数据结构与算法总结姓名:**学号:**班级:12计本(2)班这个学期在老师的带领下我们学习了数据结构与算法这门课程。在本次数据结构与算法的学习中最令我深刻的是关于几种排序算法的学习,所以在这里我想对我本学期所学…

数据结构中排序总结

排序总结排序方法平均时间最坏时间辅助存储简单排序O(n2)O(n2)O(1)快速排序O(nlogn)O(n2)O(logn)堆排序O(nlogn)O(nlogn)O(1)归并排序O(nlogn)O(nlogn)…

数据结构之排序总结(C语言)

数据结构实验课程之手工执行一下排序算法写出每一趟排序结束时的关键码状态includeltstdiohgtincludeltstdlibhgtdefinemaxsize20结构体的定义typedefstructi...

数据结构排序算法总结I

数据结构排序算法总结I考研复习到数据结构排序这章了这章的内容比较经典都是一些很好的算法将来很可能会用得到总结一下加深一下印象文章篇幅有点大请点击查看更多下面是跳转链接12312三选择排序1简单选择排序2堆排序五...

数据结构中常见的排序算法总结

几种常见排序算法的比较与实现1冒泡排序BubbleSort冒泡排序方法是最简单的排序方法这种方法的基本思想是将待排序的元素看作是竖着排列的气泡较小的元素比较轻从而要往上浮在冒泡排序算法中我们要对这个气泡序列处理...

数据结构与算法总结1

数据结构与算法学习心得不管学习什么,概念是基础,所有的知识框架都是建立在基础概念之上的。所以,第一遍看课本要将概念熟记于心,然后构建知识框架。数据结构包括线性结构、树形结构、团状结构或网状结构。线性结构包括线性…

数据结构总结

排序算法总结一综述学的排序算法有插入排序合并排序冒泡排序选择排序希尔排序堆排序快速排序计数排序基数排序1所谓排序稳定就是指如果两个数相同对他们进行的排序结果为他们的相对顺序不变例如A12121这里排序之后是A1...

数据结构(学习小结重点总结)

数据结构复习重点归纳适于清华严版教材一数据结构的章节结构及重点构成数据结构学科的章节划分基本上为概论线性表栈和队列串多维数组和广义表树和二叉树图查找内排外排文件动态存储分配对于绝大多数的学校而言外排文件动态存储...

数据结构实验报告之排序(终极版)

数据结构实验报告实验四排序一需求分析一实验目的1掌握插入排序算法直接插入希尔排序2掌握交换排序算法冒泡排序快速排序3掌握选择排序算法直接选择堆排序4掌握归并排序算法5掌握基数排序算法二实验内容给定一个序列如45...

焦作数据结构实验报告

河南省高等教育自学考试实验报告册计算机及应用专业本科段数据结构姓名李威威准考证号所属地市焦作市实验地点焦作大学实验实训中心实验日期20xx0921实验总成绩指导教师签名实验单位实验室意见主考院校审核意见河南科技...

数据结构排序总结(27篇)