1. 首页
  2. 文档大全

数据库排序(数据库)

上传者:2****1 2022-06-07 16:59:31上传 PPT文件 904.50KB
数据库排序(数据库)_第1页 数据库排序(数据库)_第2页 数据库排序(数据库)_第3页

《数据库排序(数据库)》由会员分享,可在线阅读,更多相关《数据库排序(数据库)(49页珍藏版)》请在文档大全上搜索。

1、第八章 排序 排序定义将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列叫 排序分类 按待排序记录所在位置 内部排序:待排序记录存放在内存 外部排序:排序过程中需对外存进行访问的排序 按排序依据原则 插入排序:直接插入排序、折半插入排序、希尔排序 交换排序:冒泡排序、快速排序 选择排序:简单选择排序、堆排序 归并排序:2-路归并排序 基数排序 按排序所需工作量 简单的排序方法:T(n)=O(n) 先进的排序方法:T(n)=O(logn) 基数排序:T(n)=O(d.n) 排序基本操作 比较两个关键字大小 将记录从一个位置移动到另一个位置 8.1 插入排序 直接插入排序 排序过

2、程:整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序算法描述typedef struct int key; float info;JD;void straisort(JD r,int n) int i,j; for(i=2;i=n;i+) r0=ri; j=i-1; while(r0.keyrj.key)/后移 rj+1=rj; j-; rj+1=r0; 例49 38 65 97 76 13 27i=2 38 (38 49) 65 97 76 13 27i=3 65 (38 49 65) 97 76 13 27i=4

3、97 (38 49 65 97) 76 13 27i=5 76 (38 49 65 76 97) 13 27i=6 13 (13 38 49 65 76 97) 27i=1 ( )i=7 (13 38 49 65 76 97) 2727jjjjjj977665493827 (13 27 38 49 65 76 97)排序结果: 算法评价 时间复杂度 若待排序记录按关键字从小到大排列(正序)Y关键字比较次数:112nniY记录移动次数:)1(222nni 若待排序记录按关键字从大到小排列(逆序)Y关键字比较次数:2)1)(2(2nniniY记录移动次数:2)1)(4()1(2nnini 若待排序

4、记录是随机的,取平均值Y关键字比较次数:42nY记录移动次数:42nT(n)=O(n) 空间复杂度:S(n)=O(1)Ch8_1.c 折半插入排序 排序过程:用折半查找方法确定插入位置的排序叫例i=1 (30) 13 70 85 39 42 6 20i=2 13 (13 30) 70 85 39 42 6 20i=7 6 (6 13 30 39 42 70 85 ) 20.i=8 20 (6 13 30 39 42 70 85 ) 20sjmi=8 20 (6 13 30 39 42 70 85 ) 20sjmi=8 20 (6 13 30 39 42 70 85 ) 20sjmi=8 20

5、(6 13 30 39 42 70 85 ) 20sji=8 20 (6 13 20 30 39 42 70 85 )算法描述算法评价 时间复杂度:T(n)=O(n) 空间复杂度:S(n)=O(1)Ch8_2.cvoid binsort(JD r,int n) int i,j,s,m,k; for(i=2;i=n;i+) r0=ri; s=1; j=i-1; while(s=j)/找插入位置 m=(s+j)/2; if(r0.key=s;k-)/元素后移 rk+1=rk; rs=r0; 希尔排序(缩小增量法) 排序过程:先取一个正整数d1n,把所有相隔d1的记录放一组,组内进行直接插入排序;然

6、后取d2d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止取d3=1三趟分组:13 27 48 55 4 49 38 65 97 76三趟排序:4 13 27 38 48 49 55 65 76 97例 初始: 49 38 65 97 76 13 27 48 55 4一趟排序:13 27 48 55 4 49 38 65 97 76二趟排序:13 4 48 38 27 49 55 65 97 76取d1=5一趟分组:49 38 65 97 76 13 27 48 55 4取d2=3二趟分组:13 27 48 55 4 49 38 65 97 76 算法描述Ch8_3.c

7、例49 38 65 97 76 13 27 48 55 4#define T 3int d=5,3,1;ji49133827一趟排序:13 27 48 55 4 49 38 65 97 76jiji274jiji55ji38jijiji二趟排序: 13 4 48 38 27 49 55 65 97 76jiji6548ji9755ji764void shellsort(JD r,int n,int dT) int i,j,k; JD x; k=0; while(kT)/改正步长改正步长 for(i=dk+1;i=0)&(x.keyr2.key,则交换;然后比较第二个记录与第三个记录;依

8、次类推,直至第n-1个记录和第n个记录比较为止第一趟冒泡排序,结果关键字最大的记录被安置在最后一个记录上 对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第n-1个记录位置 重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止例49 38 65 97 76 13 27 30初始关键字38 49 65 76 13 27 30 97第一趟38 49 65 13 27 30 76第二趟38 49 13 27 30 65第三趟38 13 27 30 49第四趟13 27 30 38第五趟13 27 30第六趟void bubble_sort(JD r,int n) in

9、t m,i,j,flag=1; JD x; m=n-1; while(m0)&(flag=1) flag=0; for(j=1;jrj+1.key) flag=1; x=rj; rj=rj+1; rj+1=x; m-; 算法描述 算法评价 时间复杂度 最好情况(正序)Y比较次数:n-1Y移动次数:0 最坏情况(逆序)Y比较次数:)(21)(211nninniY移动次数:)(23)(321nninni 空间复杂度:S(n)=O(1)T(n)=O(n)Ch8_4.c 快速排序 基本思想:通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别

10、对这两部分记录进行排序,以达到整个序列有序 排序过程:对rst中记录进行一趟快速排序,附设两个指针i和j,设枢轴记录rp=rs,x=rp.key 初始时令i=s,j=t 首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp交换 再从i所指位置起向后搜索,找到第一个关键字大于x的记录,和rp交换 重复上述两步,直至i=j为止 再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止例初始关键字: 49 38 65 97 76 13 27 50 ijxji 完成一趟排序: ( 27 38 13) 49 (76 97 65 50) 分别进行快速排序: ( 13) 27 (38) 49

11、(50 65) 76 (97) 快速排序结束: 13 27 38 49 50 65 76 974927ijijij4965ji1349ij4997ijvoid qksort(JD r,int t,int s) int i,j,k; JD x; if(t=s) return; i=t; j=s; x=ri; while(ij) while(i=x.key) j-; if(ij) ri=rj; i+; while(ij)&(ri.key=x.key) i+; if(ij) rj=ri; j-; ri=x; qksort(r,t,j-1); qksort(r,j+1,s); 算法描述 算法评

12、价 时间复杂度 最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n) 最坏情况(每次总是选到最小或最大元素作枢轴)T(n)=O(n) 空间复杂度:需栈空间以实现递归 最坏情况:S(n)=O(n) 一般情况:S(n)=O(log2n)T(n)=O(n)Ch8_5.c 8.3 选择排序 简单选择排序 排序过程 首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换 再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换 重复上述操作,共进行n-1趟排序后,排序结束例初始: 49 38 65 97 76 13 27 kjjjjjj

13、kki=11349一趟: 13 38 65 97 76 49 27 i=2kkjjjjj2738二趟: 13 27 65 97 76 49 38 三趟: 13 27 38 97 76 49 65 四趟: 13 27 38 49 76 97 65 五趟: 13 27 38 49 65 97 76 六趟: 13 27 38 49 65 76 97 排序结束: 13 27 38 49 65 76 97void smp_selesort(JD r,int n) int i,j,k;/k标定最小元素的下标 JD x; for(i=1;in;i+)/循环n1次找出n1 个最小值 k=i; for(j=i+

14、1;j=n;j+)/从后边找最小 if(rj.key=1;i-) sift(r,i,n); for(i=n;i=2;i-) x=r1; r1=ri; ri=x; sift(r,1,i-1); int sift(JD r,int k,int m) int i,j; JD x; i=k; x=ri; j=2*i; while(j=m) if(jrj+1.key) j+; if(x.keyrj.key) ri=rj; i=j; j*=2; else j=m+1; ri=x; 8.4 归并排序 归并将两个或两个以上的有序表组合成一个新的有序表,叫 2-路归并排序 排序过程 设初始序列含有n个记录,则可

15、看成n个有序的子序列,每个子序列长度为1 两两合并,得到n/2个长度为2或1的有序子序列 再两两合并,如此重复,直至得到一个长度为n的有序序列为止例初始关键字: 49 38 65 97 76 13 27一趟归并后: 38 49 65 97 13 76 27二趟归并后: 38 49 65 97 13 27 76三趟归并后: 13 27 38 49 65 76 97 算法描述 算法评价 时间复杂度:T(n)=O(nlog2n) 空间复杂度:S(n)=O(n)Ch8_9.c 8.5 基数排序 多关键字排序 定义:例 对52张扑克牌按以下次序排序:23A23A23A23A两个关键字:花色( ) 面值(

16、23A)并且“花色”地位高于“面值” 多关键字排序方法 最高位优先法(MSD):先对最高位关键字k1(如花色)排序,将序列分成若干子序列,每个子序列有相同的k1值;然后让每个子序列对次关键字k2(如面值)排序,又分成若干更小的子序列;依次重复,直至就每个子序列对最低位关键字kd排序;最后将所有子序列依次连接在一起成为一个有序序列 最低位优先法(LSD):从最低位关键字kd起进行排序,然后再对高一位的关键字排序,依次重复,直至对最高位关键字k1排序后,便成为一个有序序列 MSD与LSD不同特点 按MSD排序,必须将序列逐层分割成若干子序列,然后对各子序列分别排序 按LSD排序,不必分成子序列,对

17、每个关键字都是整个序列参加排序;并且可不通过关键字比较,而通过若干次分配与收集实现排序 链式基数排序 基数排序:借助“分配”和“收集”对单逻辑关键字进行排序的一种方法 链式基数排序:用链表作存储结构的基数排序 链式基数排序步骤 设置10个队列,fi和ei分别为第i个队列的头指针和尾指针 第一趟分配对最低位关键字(个位)进行,改变记录的指针值,将链表中记录分配至10个链队列中,每个队列记录的关键字的个位相同 第一趟收集是改变所有非空队列的队尾记录的指针域,令其指向下一个非空队列的队头记录,重新将10个队列链成一个链表 重复上述两步,进行第二趟、第三趟分配和收集,分别对十位、百位进行,最后得到一个

18、有序序列例初始状态:278109063930589184505269008083109589269278063930083184505008e0e1e2e3e4e5e6e7e8e9f0f1f2f3f4f5f6f7f8f9一趟分配930063083184505278008109589269一趟收集:505008109930063269278083184589二趟收集:083184589063505269930e0e1e2e3e4e5e6e7e8e9f0f1f2f3f4f5f6f7f8f9二趟分配008109278930063083184505278008109589269一趟收集:0080630

19、83109184269278505589930三趟收集:109008184930e0e1e2e3e4e5e6e7e8e9f0f1f2f3f4f5f6f7f8f9三趟分配063083269278505589505008109930063269278083184589二趟收集: 算法描述 算法评价 时间复杂度: 分配:T(n)=O(n) 收集:T(n)=O(rd)T(n)=O(d(n+rd)其中:n记录数 d关键字数 rd关键字取值范围 空间复杂度:S(n)=2rd个队列指针+n个指针域空间Ch8_10.c初始状态:12781090639305891845052690080830234567891

20、0f0=0 e0=0f1=0 e1=0f2=0 e2=0f3=0 e3=0f4=0 e4=0f5=0 e5=0f6=0 e6=0f7=0 e7=0f8=0 e8=0f9=0 e9=011223344566778910493006308318450527800810958926903106719258f0=0 e0=0f1=0 e1=0f2=0 e2=0f3=0 e3=0f4=0 e4=0f5=0 e5=0f6=0 e6=0f7=0 e7=0f8=0 e8=0f9=0 e9=0134477 910493006308318450527800810958926903106719258一趟收集:310

21、16258750500810993006326927808318458909243811065二趟收集:750500810993006326927808318458909243811065二趟收集:f0=0 e0=0f1=0 e1=0f2=0 e2=0f3=0 e3=0f4=0 e4=0f5=0 e5=0f6=0 e6=0f7=0 e7=0f8=0 e8=0f9=0 e9=04479287928900806308310918426927850558993003102681754三趟收集:311065(1)从平均时间性能而言,快速排序最佳,其所需时间最省,但快速 排序在最坏情况下的时间性能不如堆

22、排序和合并排序。(2)n较大时,合并排序所需时间小于堆排序,但所需辅助空间最多O (n)。(3)直接插入排序最简单,在文件基本排序(局部有序)或n值较小 时,是最佳排序方法。因此可与其它方法结合使用。(4)基数排序最适合于n值较大且k值较小的文件排序。若k值也很大 ,而文件中多数记录“最高次序位”均不同,也可先按最高次序位 k值将文件分成若干小文件而后进行直接插入排序。(5)文件记录很大时,为避免过多记录移动,可采用“索引”结构,即 地址排序。 综上所述,在本章讨论的所有排序方法中,没有哪一种是绝对最优的。有的适用于n较大的情况,有的适用于n较小的情况,有的 等等。因此,在实用时需根据不同情况适当选用,甚至可将多种方法结合起来使用。


文档来源:https://www.renrendoc.com/paper/212545678.html

文档标签:

下载地址