注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 利用IPSec实现网络安全之..
 帮助

数据结构的复习-排序


2007-06-19 12:37:32
 标签:数据结构 排序   [推送到技术圈]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://win7452.blog.51cto.com/147513/30687
数据结构的排序问题:
1.排序方法的稳定性:
任一无序序列,如按主关键字排序,排序的结果唯一;档案次关键字排序时,由于可能存在两个或以上相同的记录,则排序结果不唯一,判断:如按此关键字排序,排序前Ri在Rj前而当排序后Ri在Rj之后了,则说明排序方法不稳定,如果Ri仍在Rj前则说明排序方法不稳定。
2.插入排序:
 
A. 直接插入排序:
思想:将第一个字符看成有序序列,然后从第2个记录起逐个插入,直至最后一个记录插入完毕,整个序列为一个有序序列为止。
时间复杂度:o(n*n);只需一个记录的辅助空间。
 
B.折半插入排序:
思想:在直接插入排序的基础上,折半比较进而寻找插值位置的一种方法。
分析:原无序序列存放在一个下标从0开始的一位数组当中,但0位不作为存储记录用,而作为排序的辅助位;插入总是将第i位的记录插入到前(i—1)个记录已经排好的有序序列当中,a。故设high=i—1,只是未插入时有序序列的最高位;b。将第i位待插入值存放在[0]中,即为R[0],用R[0]来和序列的中间纪录R[m]相比较,如果R[0] 〉R[m],则底线low上提为m+1否则上限high下降为high=m-1,即以m为分界在上一半中寻找插入位,还是在下一半中寻找插入位;如此a,b,步骤反复执行,进而缩小范围锁定插入位,(即:low=high= m,如果下一次比较R[0] 〉R[m],则R[0]内的记录应插在m的下一位置high+1;如果R[0] 〈 R[m] 则将R[0]内的记录插在m位置上,即:high+1,此时的high=m-1,而high+1=m)。
第i个记录插入位置找到后,实现插入则需要移位,既要从插入位开始(high+1)后移在插入R[0]的纪录到R[high+1]位置上。就ok了。说得有点罗嗦哈!
 
C.2—路插入排序
只是折半插入排序的一种改进,主要是为了减少移动记录的次数,但同时需要n个辅助的存储空间。
思想:另建一个有n个辅助空间的数组d,将n个记录的无序序列R中第一个记录 R[1]赋给d[1],并以d[1]为有序序列中的中间位置记录,再从R中第二个记录起和d[1]比较,大于d[1]放在其后的有序表中,小于d[1]放在其后的有序表中,放完为止。
注意:将辅助空间d堪称是一个循环向量。
实现算法:需要设一个与R相同类型的数组d,将其看成循环向量,并设两个指针first和final,分别指向过程中有序序列的第一个和最后一个元素。哦可!
 
D.表插入排序
不需要移动记录,而是将原顺序存储结构改为链式存储结构。
思想:用静态链表结构作为待排记录序列的德存储结构,并设数组下标为R[0]的分量为表头结点,   舍弃记录关键字取最大整数MAXINT,首先将R[1]和表头结点R[0]构成一个循环链表,然后将下标2到n的记录一次插入到循环链表中,和直接插入相比,不同的仅是以修改2n次指针代替移动记录。
注意:R[0]存放的MAXINT是循环链表当中记录的个数,真正的排序的记录是从下标为R[1]开始的。
分析:得到的是一个有序的静态链表,只能顺序查找而不能够随即查找。
 
2。希尔排序 (又称:增量排序——增量一定的跳跃式排序。)
思想:将待排序列分割成若干个子序列,对每个字序列进行插入排序;待整个序列中的记录“基本有序”时,在对全体进行一次直接插入排序。
算法:取一小于待排序列记录总数n的奇数d1,(d1=n / 2或n/2 +1)并以d为增量将序列分成d1个子序列,(每个子序列中只含有两个记录,对这两个记录进行排序),d1个子序列全排完成为第一趟排序,同样的过程进行第二趟排序,类推的进行,当d i =1 时;最后一趟两两排序,此时原待排序列已经“基本有序”,最后作记录的少量比较和移动即可完成排序。
 
3.快速排序
 
A.起泡排序:起泡(关键字较小的)上浮,石头(关键字较大的)下沉。
思想:相邻比较换位。
分析:第一趟排序,n个数中最大的数沉底,第二趟排序,n-1个数中最大的数沉底,以此类推,直到n-1=1为止,所有n个记录有序。
 
B.快速排序:是对起泡排序的一种改进。
思想:通过一趟快速排序,将待排序列分成两部分,其中一部分记录的关键字均比另一部分关键字小;进而可分别对这两部分记录继续进行排序,以达到整个序列有序。
算法:附设两个指针low和high,分别指向受记录和尾记录,设枢纽记录关键字(k);首先从high向前搜索直到第一个小于枢纽k的记录,与k作位置交换;再从low向后搜索找到第一个大于枢纽k的记录交换,然后从high继续向前搜索,low向后搜索;当high=low时第一趟快速排序完成。
枢纽k的取法:T.r [m],T.r [n],T.r [(m+n)/2] 三者中去中间大小的。
快速排序是目前被认为是最好的一种内部排序。
 
4.选择排序
A.简单选择排序
思想:就是每一趟在n-i+1个记录中选取关键字最小的记录作为序列中第i个记录。
 
B.树形选择排序:(又称:锦标赛排序)
思想:将待排序列的n个记录,作为完全二叉树的叶子结点,每个非终端结点均为其左右孩子当中较小的一个,则根节点的关键字为叶子节点中的最小关键字。输出最小关键字后将叶子节点中关键字为最小的记录改为无穷大,再重新求小,输出次小的根节点,类推全部记录输出完为止。
 
C.堆排序:是树形选择排序的一种改进,去掉了(无穷大参与比较)。
堆的概念:将和待排序列对应的一位数组堪称是一个完全二叉树,此完全二叉树中所有非终端结点的值均不大于(不小于)其左右孩子结点的值,由此可知序列若为堆,则堆顶元素必为序列中n个值中的最小值(最大值)。
思想:将待排序列按全须排成一棵完全二叉树,将此二叉树经过反复的“筛选”过程构成堆,进而排序。
算法:对排序可以分成两个过程:a.组建一个堆。将待排的序列,按顺序一行一行的,排成一棵无序的二叉树,首先,取第n/2个元素,用此元素和其左右子树进行比较取最小的上位,作为根节点(即:跟左右子树三者中取最小的;一个分支一个分支的排);b.排序堆。利用最底层的最后一个元素,做替换补位之用;由上至下左右子树进行比较,小的上位,原根补位。当对的根节点输出要与原对中队后一个元素换位,但此时的输出节点不在于对有边相连,同理,按上述情况筛选直到最后一个节点输出。
 
5.归并排序
 
A.2—路归并排序
思想:假设初始序列含有n个记录,将每一个记录看成是一个有序的子序列,每个子序列的长度为1,然后两两归并得到n/2个长度为2或1的有序字序列;在两两进行归并,如此重复操作,直到得到一个长度为n的有序序列为止。
 
6.基数排序
A.多关键字的排序:
思想:一个待排序列当中的记录,均包含d个关键字排序时从每一个记录的第一个关键字开始考察的称为最高为优先,从最低为关键字开始向前考察的叫做最低为优先。
 
B.链式基数排序
基的概念:就是关键字的具体所处的范围。
思想:待排序列采取静态连标的存储结构,每个记录有d个关键字则序列需要d趟排序,每一趟排序包含两个过程,即:分配和收集。
分析:分配:就是按当前考察的关键字将所有记录分成若干个字序列。收集:将这些字序列用指针连接起来。
例:对以下记录:12  2  16  30  8  28  4  10  20  6  18 进行链式基数排序。
析:待排序列中的记录全部都是整形数字,基是0~9;则可将所有记录分成:30  10  20;12  2 ; 4 ; 16  6;8  28  18;等五个子序列;指针连接起来就是一趟基数排序的结果:
30  10  20  12  2  4  16  6  8  28  18 。
 
 
以上是软考复习数据结构排序时的个人总结,错误疏漏在所难免,来看过的朋友多批评指教阿!有时间再敷上一些例题,以便与理解,以后用到的时候,复习也会方便得,故写在这里!
 
 
 
 

本文出自 “一路悠扬” 博客,请务必保留此出处http://win7452.blog.51cto.com/147513/30687





    文章评论
 
2007-06-19 22:16:29
顶个先。留个脚印

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: