计算机软件排序,计算机软件技术编程基础 排序.ppt

《计算机软件技术编程基础 排序.ppt》由会员分享,可在线阅读,更多相关《计算机软件技术编程基础 排序.ppt(40页珍藏版)》请在人人文库网上搜索。

1、基本排序技术,排序是将一个无序序列整理成非递减顺序排列的有序序列。,稳定排序:排序过程中,相同关键字的元素的相对次序不变。 不稳定排序:排序过程中,相同关键字的元素的相对次序发生变化。,例如:34,12,34,08,96 08,12,34, 34,96 稳定 08,12, 34,34,96 不稳定,一 交换排序 比较两个待排序纪录的关键字,若为逆序则相互交换位置,否则,保持原来位置不变。冒泡排序、快速排序,1 冒泡排序 基本思想: 从前往后扫描,逐个比较相邻的两个元素,发现倒序即交换直到将第N-1个纪录和第N个记录交换为止。,5,1,7,3,1,6,9,4,2,8,6,原序列,5,1,7,3,。

2、1,6,9,4,2,8,6,1 5,3 7,1 7,6 7,4 9,2 9,8 9,6 9,关键字最大的安置到最后,从后往前扫描,将第N-1个纪录和前一个关键字进行比较,将小的放在前面,大的放在后面,依次类推,直到第2个记录和第1个记录交换为止。,6 8,2 4,2 7,1 3,1 5,2 6,关键字最小的安置到最前面,3 5,2 5,4 7,6 7,4 6,4 5,2 3,对剩余的线性表重复操作,对线性表的每次来回操作都将最大的沉到表底,最小的像气泡冒到表头。,void bub(int p,int n) int m,k,j,i; int d; k=0;m=n-1; /初始时子表表头k和表尾m。

3、位置 while(kpi+1) d=pi;pi=pi+1;pi+1=d;m=i; j=k+1;k=0; for(i=m;i=j;i-) if(pi-1pi) d=pi;pi=pi-1;pi-1=d;k=i; return; ,待排数组,数组长度,while(k扫描无交换,表尾置0 for(i=k;i扫描,子表pm+1沉底 if(pipi+1) d=pi;pi=pi+1;pi+1=d;m=i; /m为该趟冒泡后子表表尾的位置 j=k+1;k=0; /如果=j;i-) /从pi) d=pi;pi=pi-1;pi-1=d;k=i; /k为该趟冒泡后子表表头的位置 ,算法分析: 稳定 时间代价: 需要。

4、进行比较的次数为, 快速排序 1) 从无序表中选取一个元素T,对线性表进行分割,大于T的元素放在前表中,小于T的元素放在后表中。此时,线性表分成前后两个子表; 2 )对分割的两个子表再进一步分割,直到所有的子表为空为止;,无序线性表,T,T,T,分割,分割,分割,i为表头位置; k 为表中位置; j为表尾位置,比较大小,取中间值为分割元素t,该元素在表中的位置存放表头元素,将表头位置腾空;,表尾位置前移(j-);,该元素放入表头,表头位置后移(i+);,Pjt,从前往后扫描,pi,Pi=t,表头位置后移(i+);,该元素放入表尾,表尾位置前移(j-) ;,读入表尾元素;,在一趟快速排序中,整个。

5、过程交替地从后往前扫描关键字值小的记录和从前往后扫描关键字值大的记录并放置到对应端空出的位置中,又空出新的位置。当从两个方向的扫描重合时,即i=j,就找到了基准记录的存放位置。 按照快速排序的基本思想,在一趟快速排序之后,需要重复(1),(2),直到找到所有记录的相应位置。快速排序是一个递归的过程。 快速排序算法是不稳定排序,对于有相同关键字的记录,排序后有可能颠倒位置。,i=0;j=10;k=5;,i=2,t=5,2,7,4,6,插入排序,插入排序的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子表中的适当位置,直到全部记录插入完成为止。也就是说,将待序列表分成左右。

6、两部分,左边为有序表(有序序列),右边为无序表(无序序列)。整个排序过程就是将右边无序表中的记录逐个插入到左边的有序表中,构成新的有序序列。根据不同的插入方法,插入排序算法主要包括:直接插入排序、折半插入排序、表插入排序和希尔排序等。本章重点介绍简单插入排序、希尔排序。,简单插入法:将一个记录插入到已排好序的有序表中 基本思想:将待排序表看成左右两部分,左边为有序区,右边为无序区;整个排序过程就是将右边无序区的元素插入到左边有序区中。(插入时,有序子表从最后一个元素开始,逐个向前与待插入元素比较),数据表a=12,5,4,9,5从小到大排序,5,12,5,4,12,5,4,9,12,9,5,1。

7、2,9,5,void insort(T p,int n) int j,k; T t; for(j=1;j=0) ,【例】假设有7个待排序的记录,它们的关键字分别为23,4,15,8,19,24,15,用直接插入法进行排序。,【解】简单插入排序过程如图所示。方括号 中为已排好序的记录的关键字,有两个记录的关键字都为15,为表示区别,将后一个15加下划线。,简单插入排序,for (j=1;jn;j+),pi插入到有序表中,后移、插入,算法分析:由于该算法在搜索插入位置时遇到关键字值相等的记录时就停止操作,不会把关键字值相等的两个数据交换位置,所以该算法是稳定的。,特点: 算法稳定 当较小时,效果较。

8、好,但较大时,不宜采用。当原始序列越接近有序时,该算法的执行效率就越高。,时间代价: 需要进行比较的次数为,简单插入排序的两个性质: 1 在最好的情况下(序列本身已有序),时间代价为O(n) 2 对于短序列,插入排序比较有效,shell排序利用了插入排序的两个性质,算法思想: 先将序列转化为若干小序列,在这些小序列内进行插入排序 逐渐扩大小序列的规模,而减少小序列个数,使得待排序序列逐渐处于更有序的状态 最后对整个序列进行扫尾直接插入排序,从而完成排序,希尔排序缩小增量排序 基本步骤: 取一个正整数h1=n/2, 每隔步长h1取一个元素,放在一个组中,在各组中进行插入排序。,h1=12/2,h。

9、2=6/2=3,2 再取h2=h1/2,分组排序,h3=1,算法分析: 不稳定 时间代价: 与数据表的初始状态关系不大,需要循环log2n趟,每趟O(n),时间复杂度为O(n log2n),三 选择排序,算法思想: 找出剩下的未排序记录中的最小记录,然后直接与数组中第i个记录交换,比冒泡排序减少了移动次数,i=1,对于长度为n的序列,选择序列需要扫描n-1遍,每次扫描均从剩余的子表中找出最小的元素,然后将最小的元素与子表中的第一个元素进行交换。 比较次数:(n-1)+(n-2)+2+1=n(n-1)/2 交换次数:n-1 时间复杂度O(n2),四 归并排序,基本思想:将两个或两个以上的有序表合。

10、并成一个新的有序表。 步骤: 将整个表看成个有序子表,每个子表长度为; 两两归并,得到长度为的个子表; 再两两归并,一直得到长度为的有序表为止;,i=1,j=5,如果L(i)L(j), A(K)=L(i); i+1,k+1,如果L(i)L(j), A(K)=L(j); j+1,k+1,L,A,k,如果i或j已指到子表子表的表尾,则将另一子表的剩余部分复制到A表中,i=1,j=5,L,A,k,i=1;j=5,i=1;j=6,i=2;j=6,i=3;j=6,i=3;j=7,i=4;j=7,i=4;j=8,3.4 二叉排序树及其查找,一 二叉排序树及其构造 1 二叉排序树的定义 左子树结点值=根结点。

11、 左右子树也满足上述条件,二叉排序树的构造,一棵二叉排序树b中插入一个结点*s 若b为空树,则将*s作为根结点插入 (2)若b不为空树,则 s-data data =b的父结点的值,*s插入到b的右子树中,75,82,80,85,82,68,71,77,88,构造二叉排序树,34,84,56,85,78,36,45,45,91,78,如何定义结点?,struct bsnode int d; bsnode *lchild,*rchild; ;,bsnode *insert_bs_tree(bsnode *bt, int x),二叉排序树的插入 insert_bs_tree( ),传入的形参:根结。

12、点,插入元素,insert_bs_tree(bsnode *bt, int x),返回值:根结点,bsnode *insert_bs_tree(bsnode *bt, int x) ,bsnode *p,*q;,定义两个结点,构造一个新结点,p=new(bsnode); p-d=x; p-lchild=NULL; p-rchild=NULL;,建立一个搜索指针,从根结点开始搜索,q=bt;,如果二叉排序树为空,将新结点作为根结点,if(bt=NULL) bt=p;,如果二叉排序树不为空,将新结点插入到二叉树中,else ,while(q-lchild!=p) else q-lchild=p; 。

13、,如果插入值小于搜索结点q的值,1搜索结点q的左子树的结点已存在,2搜索结点q的左子树为空,如果插入值大于搜索结点q的值,1搜索结点q的右子树的结点已存在,2搜索结点q的右子树为空,else if(q-rchild!=NULL) q=q-rchild; else q-rchild=p; , return bt; ,返回根结点,二叉排序树的查找 从二叉排序树的根结点开始与被查值进行比较,若等于根结点,则查找结束 根结点,到右子树查找;,void intrav(bsnode *bt) if(bt!=NULL) intrav(bt-lchild); coutdrchild); return; ,二叉排序树的查找效率接近对分查找。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值