实用数据结构(c++描述)(第二版)第9章.pptVIP

  • 1
  • 0
  • 约1.46万字
  • 约 76页
  • 2017-10-02 发布于广东
  • 举报
实用数据结构(c描述)(第二版)第9章

第9章 排序技术 第9章 排序技术 9.1 互换类排序 9.2 插入类排序 9.3 选择类排序 9.4 拓扑分类 9.5 其他排序方法简介 排序是在数据处理中经常要使用的一种重要的运算。如何进行排序,特别是高效率的排序是计算机应用中的一个重要课题。排序的目的之一就是方便数据的查找。 9.1 互换类排序 9.1.1 冒泡排序 9.1.2 快速排序 9.1.1 冒泡排序 首先,从表头开始往后扫描线性表,在扫描过程中逐次比较相邻两个元素的大小。若相邻两个元素中,前面的元素大于后面的元素,则将它们互换,称之为消去了一个逆序。显然,在扫描过程中,不断地将两相邻元素中的大者往后移动,最后就将线性表中的最大者换到了表的最后。 然后从后到前扫描剩下的线性表,同样,在扫描过程中逐次比较相邻两个元素的大小。若相邻两个元素中,后面的元素小于前面的元素,则将它们互换,这样就又消去了一个逆序。显然,在扫描过程中,不断地将两相邻元素中的小者往前移动,最后就将剩下线性表中的最小者换到了表的最前面。 对剩下的线性表重复上述过程,直到剩下的线性表变空为止,此时的线性表已经变为有序。 算法:冒泡排序 输入:无序序列P(1:n)。 输出:有序序列P(1:n)。 PROCEDURE BUBSORT(P,n) k=1; m=n WHILE (k<m) DO [子表未空] { j=m-1; m=0 FOR i=k TO j DO [从前往后扫描子表] IF (p(i)>p(i+1)) THEN [发现逆序进行交换] {d=p(i);p(i)=p(i+1);p(i+1)=d;m=i} j=k+1; k=0 FOR i=m TO j BY -1 DO [从后往前扫描子表] IF (p(i-1) >p(i)) THEN[发现逆序进行交换] {d=p(i);p(i)=p(i-1);p(i-1)=d;k=i} } RETURN bubsort(p,n) int n; ET p[]; { int m,k,j,i; ET d; k=0; m=n-1; while (k<m) /*子表未空*/ { j=m-1; m=0; for(i=k;i<=j;i++) /*从前往后扫描*/ if (p[i]>p[i+1]) /*发现逆序进行交换*/ {d=p[i];p[i]=p[i+1];p[i+1]=d;m=i;} j=k+1; k=0; for (i=m;i>=j;i--) /*从后往前扫描*/ if (p[i-1] >p[i]) /*发现逆序进行交换*/ {d=p[i];p[i]=p[i-1];p[i-1]=d;k=i;} } return; } 9.1.2 快速排序 快速排序是由冒泡排序改进而得的,是一种分区交换排序方法。基本思想如下: 从线性表中选取一个元素,设为T。然后将线性表后面小于T的元素移到前面,而前面大于T的元素移到后面,结果就将线性表分成了两部分(称为两个子表),T插入到其分界线的位置处。这个过程称为线性表的分割。通过对线性表的一次分割,就以T为分界线,将线性表分成了前后两个子表,且前面子表中的所有元素均不大于T,而后面子表中的所有元素均不小于T。 之后对所分的两个子表分别重复上述过程,直到每个子表为空为止,则此时的线性表就变成了有序表。 在对线性表或子表进行分割时,可以按如下步骤: 首先,在表的第一个、中间一个与最后一个元素中选取中项,设为P(k),并将P(k)赋给T,再将表中的第一个元素移到P(k)的位置上。 然后设置两个指针i和j分别指向表的起始与最后的位置。反复作以下两步: (1)将j逐渐减小,并逐次比较P(j)与T,直到发现一个P(j)<T为止,将P(j)移到P(i)的位置上。 (2)将i逐渐增大,并逐次比较P(i)与T,直到发现一个P(i)>T为止,将P(i)移到P(j)的位置上。 上述两个操作交替进行,直到指针i与j指向同一个位置(即i=j)为止,此时将T移到P(i)的位置上。 算法:线性表的分割 输入:待分割的子表P(m:n)。 输出:分割后的分界线位置i。 PROCEDURE SPLIT(P,m,n,i) 选取P(k) 其中m≤k≤n T=P(k);P(k)=P(m) i=m;j=n WHILE

文档评论(0)

1亿VIP精品文档

相关文档