收藏 分享(赏)

各种排序算法比较.doc

上传人:j35w19 文档编号:7132057 上传时间:2019-05-06 格式:DOC 页数:10 大小:58KB
下载 相关 举报
各种排序算法比较.doc_第1页
第1页 / 共10页
各种排序算法比较.doc_第2页
第2页 / 共10页
各种排序算法比较.doc_第3页
第3页 / 共10页
各种排序算法比较.doc_第4页
第4页 / 共10页
各种排序算法比较.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、第二课堂与理论创新论文姓名:林琼学号:20076826班级:07 网 1学院:信息学院各排序算法的比较1.稳定性比较插入排序、冒泡排序、二叉树排序、二路归并排序及其他线形排序是稳定的选择排序、希尔排序、快速排序、堆排序是不稳定的2.时间复杂性比较插入排序、冒泡排序、选择排序的时间复杂性为 O(n2)其它非线形排序的时间复杂性为 O(nlog2n)线形排序的时间复杂性为 O(n);3.辅助空间的比较线形排序、二路归并排序的辅助空间为 O(n),其它排序的辅助空间为 O(1);4.其它比较插入、冒泡排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度。反而在这种情况下,快速排

2、序反而慢了。当 n 较小时,对稳定性不作要求时宜用选择排序,对稳定性有要求时宜用插入或冒泡排序。若待排序的记录的关键字在一个明显有限范围内时,且空间允许是用桶排序。当 n 较大时,关键字元素比较随机,对稳定性没要求宜用快速排序。当 n 较大时,关键字元素可能出现本身是有序的,对稳定性有要求时,空间允许的情况下。宜用归并排序。当 n 较大时,关键字元素可能出现本身是有序的,对稳定性没有要求时宜用堆排序。相关知识介绍(所有定义只为帮助读者理解相关概念,并非严格定义):1、稳定排序和非稳定排序简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就说这种排序方法是稳定的。

3、反之,就是非稳定的。比如:一组数排序前是 a1,a2,a3,a4,a5,其中 a2=a4,经过某种排序后 a1,a2,a4,a3,a5,则我们说这种排序是稳定的,因为 a2 排序前在 a4 的前面,排序后它还是在 a4 的前面。假如变成 a1,a4,a2,a3,a5 就不是稳定的了。2、内排序和外排序在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。3、算法的时间复杂度和空间复杂度所谓算法的时间复杂度,是指执行算法所需要的计算工作量。算法的空间复杂度,一般是指执行这个算法所

4、需要的内存空间。=功能:选择排序输入:数组名称(也就是数组首地址)、数组中元素个数算法思想简单描述:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。 选择排序是不稳定的。算法复杂度 O(n2)-n 的平方=功能:直接插入排序输入:数组名称(也就是数组首地址)、数组中元素个数算法思想简单描述:在要排序的一组数中,假设前面(n-1) n=2 个数已经是排好顺序的,现在要把第 n 个数插到前面的有序数中,使得这 n 个数也是排好顺序的。如此反复循环,直到全部排好顺序。直接插入排序是稳定的。算法时间

5、复杂度 O(n2)-n 的平方=功能:冒泡排序输入:数组名称(也就是数组首地址)、数组中元素个数算法思想简单描述:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。下面是一种改进的冒泡算法,它记录了每一遍扫描后最后下沉数的位置 k,这样可以减少外层循环扫描的次数。冒泡排序是稳定的。算法时间复杂度 O(n2)-n 的平方=功能:希尔排序输入:数组名称(也就是数组首地址)、数组中元素个数算法思想简单描述:在直接插入排序算法中,每次插入一个数,使有序序列

6、只增加 1 个节点,并对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。D.L.shell 于 1959 年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量 d 分成若干组,每组中记录的下标相差 d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到 1 时,整个要排序的数被分成一组,排序完成。下面的函数是一个希尔排序算法的一个实现,初次取序列的一半为增量,以后每次减半,直到增量为1。希尔排序是不稳定的。=功能:快速排序输入:数组名称(也就是数组

7、首地址)、数组中起止元素的下标算法思想简单描述:快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少 1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。它是由C.A.R.Hoare 于 1962 年提出的。显然快速排序可以用递归实现,当然也可以用栈化解递归实现。下面的函数是用递归实现的,有兴趣的朋友可以改成非递归的。快速排序是不稳定的。最理想情况算

8、法时间复杂度 O(nlog2n),最坏 O(n2)-n 的平方=功能:堆排序输入:数组名称(也就是数组首地址)、数组中元素个数算法思想简单描述:堆排序是一种树形选择排序,是对直接选择排序的有效改进。 堆的定义如下:具有 n 个元素的序列(h1,h2,.,hn),当且仅当满足(hi=h2i,hi=2i+1)或(hi=h2i,hi=2i+1)(i=1,2,.,n/2)时称之为堆。在这里只讨论满足前者条件的堆。由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项。完全二叉树可以很直观地表示堆的结构。堆顶为根,其它为左子树、右子树。初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储序

9、,使之成为一个堆,这时堆的根节点的数最大。然后将根节点与堆的最后一个节点交换。然后对前面(n-1)个数重新调整使之成为堆。依此类推,直到只有两个节点 的堆,并对它们作交换,最后得到有 n 个节点的有序序列。从算法描述来看,堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,二是反复调用渗透函数实现排序的函数。堆排序是不稳定的。算法时间复杂度 O(nlog2n)。第二课堂与理论创新论文姓名:高洋洋学号:20074576班级:07 网 1学院:信息学院Linux 邮件服务器的搭建邮件服务器是一种用来负责电子邮件收发管理的设备。它比网络上

10、的免费邮箱更安全和高效,因此一直是企业公司的必备设备。下面是 Linux 下搭建 Mail 服务器的过程:1 用以下命令查看系统是否安装了 sendmail:rootmail /root# rpm qa |grep sendmailsendmail-8.11.0-82 卸载 sendmail:rootmail /root# rpm -e sendmail nodeps3 用以下命令杀死运行中的 sendmail 进程:rootmail /root# killall sendmail如果系统提示:sendmail: no process killed则说明当前系统中没有 sendmail 进程。

11、4 安装 postfix:rootmail /root# rpm -ivh postfix-20010228release-2.i386.rpm若已经安装,则此步可以省略。(注:安装时最好用 rpm 包,会自动创建 postfix 用户和 postfix 组)5 安装 imaprpm ivh /mnt/cdrom/RedHat/RPMS/ imap-4.7c2-12.rpmimap 使 pop3有效,即打开 110端口。 (注:安装时最好用 rpm 包)若已经安装,则此步可以省略。6 检查系统中是否安装了 cyrus-sasl执行以下命令查看系统中是否安装了 cyrus-sasl:rpm qa

12、 |grep cyurs如果您看到以下提示,则说明已经安装了 cyrus-saslroottest bye2000# rpm -qa |grep saslcyrus-sasl-devel-1.5.24-17cyrus-sasl-1.5.24-17否则,请用 rpm ivh 命令先安装所需 sasl-cyrus 包。7修改 postfix 用户同时应该让该用户不能登录到系统,也即不为该用户指定可执行的登录外壳程序和可用的用户宿主目录。编辑/etc/passwd 文件中的相关条目如下所示:postfix:x:89:89:/no/where:/no/shell 编辑后,只修改蓝色部分就可以了即:修改

13、用户的 Home directory 和 Shell 参照 /etc/passwd 文件8编辑 postfix 的主要配置文件/etc/postfix/main.cf,根据需求只需修改以下几个参数:1)mydomain指明你的域名,在这里我们指定:mydomain = 2)myoriginmyorigin 参数指明发件人所在的域名。如果你的用户的邮件地址为 ,则该参数指定后面的域名。在这里我们指定:myorigin = $mydomain3)inet_interfacesinet_interfaces = all 监听所有端口4)mydestinationmydestination 参数指定

14、postfix 接收邮件时收件人的域名,换句话说,也就是你的 postfix系统要接收什么样的邮件。通常与 myorigin 一样:mydestination = $mydomain5)mynetworks_style设置网络类型,我们指定:mynetworks_style = subnet6)ynetworks定义可以使用的此 smtp 服务器发信的客户 ip 地址,因为公司的 ip 范围已知,所以我们指定:mynetworks = 192.168.1.0/24注:此项可根据情况而定,主要是指定 ip 范围,假如公司的 ip 划分是按照网段来的,例如:10.10.1.010.10.1.9,1

15、0.10.3.010.10.3.9等等更细。根据需要,该项可以不设置。7)SMTP 的配置为了告诉 postfix 采用 sasl 来进行 SMTP 的用户认证,我们必须在/etc/postfix/main.cf 文件的最后添加以下几行:smtpd_sasl_auth_enable = yessmtpd_recipient_restrictions = permit_sasl_authenticated permit_auth_destination rejectbroken_sasl_auth_clients = yessmtpd_sasl_security_options = noanon

16、ymous说明如下:smtpd_sasl_auth_enable:告诉 SMTP 客户,该 SMTP 服务器需要进行用户认证。smtpd_recipient_restrictions = permit_sasl_authenticated permit_auth_destination reject仅仅中继通过 SMTP 认证的客户端邮件,以及接收本 postfix 为最后一站的邮件。broken_sasl_auth_clients = yes有一些 Microsoft 的 SMTP 客户端,比如 Outlook Express 4.X 采用的是非标准的 SMTP 认证协议,将该选项设置为 y

17、es 可以解决这类不兼容问题。smtpd_sasl_security_options = noanonymous控制本地 SMTP 认证所采用的机制,这里是允许任何非匿名认证方法。9配置 SASL进入/usr/lib/sasl/目录,用 touch 新建这样一个文件:roottest sasl# touch smtpd.conf在该文件中加入以下内容:roottest sasl# more smtpd.confpwcheck_method:pam也就是指定通过 PAM 来进行用户认证。10配置 PAM进入/etc/pam.d/目录,用 touch 新建这样一个文件:roottest pam.d

18、# touch smtp在该文件中加入如下内容:roottest pam.d# more smtp#%PAM-1.0auth required /lib/security/pam_stack.so service=system-authaccount required /lib/security/pam_stack.so service=system-auth也即和/etc/pam.d/pop 文件的内容是一致的。11修改/etc/shadow 文件权限因为 PAM 最终要去读取/etc/shadow 文件的内容来进行用户认证,但是/etc/shadow 文件权限是设置为只有 root 用户可

19、以读写,而我们的 postfix 是运行在 postfix 用户权限之下,所以我们要合理的设置/etc/shadow 文件权限,以便让 pam 可以读取其内容。执行以下命令,让 root 组也可以读取 shadow:roottest /etc# chmod 640 /etc/shadow然后再将 postfix 用户加入 root 组,采用以下命令:roottest /etc# usermod -G root postfix12编辑 postfix 的主要配置文件/etc/postfix/master.cf# =# service type private unpriv chroot wake

20、up maxproc command + args# (yes) (yes) (yes) (never) (100)# =smtp inet n - n - - smtpd这里开始#smtps inet n - n - - smtpd# -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes#submission inet n - n - - smtpd# -o smtpd_enforce_tls=yes -o smtpd_sasl_auth_enable=yes这里结束#628 inet n - n - - qmqpd把我标的注释部分去掉即可。13配置 pop3RedHat7.0已经使用 xinetd 代替了以前的 inetd,为了使 pop3服务启动,我们编辑/etc/xinetd.d/ipop3文件,将其中的 disable = yes 改为 disable = no 以便启动 pop3服务。为了使改动生效,执行以下命令:/etc/rc.d/init.d/xinetd reload14启动 postfix执行以下命令启动 postfix:/etc/rc.d/init.d/postfix start 这样,一个支持 SMTP 认证的 postfix 邮件服务器就配好了。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报