简单选择排序和堆排序.pptVIP

  • 13
  • 0
  • 约1.94千字
  • 约 15页
  • 2017-08-06 发布于河南
  • 举报
简单选择排序和堆排序

3.3.3 简单选择排序与堆排序 1. 简单选择排序;输入:无序序列P(1:n)。 输出:有序序列P(1:n)。 PROCEDUDE SELESORT(P,n) FOR i=0 TO n-2 DO { k=i FOR j=i+1 TO n-1 DO IF P(j)<P(k) THEN k=j IF (k≠i) THEN { d=P(i); P(i)=P(k); P(k)=d } } RETURN ; selesort(p,n) int n; ET p[]; { int i,j,k; ET d; for (i=0; i<=n-2; i=i+1) { k=i; for (j=i+1; j<=n-1; j=j+1) if (p[j]<p[k]) k=j; if (k!=i) { d=p[i];p[i]=p[k];[k]=d;} } return; } ;2. 堆排序 堆的定义: 具有n个元素的序列(h1,h2,…,hn), 当且仅当满足 (i=1,2,…,n/2)时称之为堆。 由堆的定义可以看出,堆顶元素 (即第一个元素)必为最大项。;或 具有n个元素的序列(h1,h2,…,hn), 当且仅当满足 (i=1,2,…,n/2)时称之为堆。 ;序列(91,85,53,36,47,30,24,12)是一个堆 ;调整建堆 在一棵具有n个结点的完全二叉树(用一维数组 H(1:n)表示)中,假设结点H(m)的左右子树均 为堆,现要将以H(m)为根结点的子树也调整为堆。;;;;堆排序 (1)首先将一个无序序列建成堆。 (2)然后将堆顶元素(序列中的最大项)与堆中最后 一个元素交换(最大项应该在序列的最后)。 不考虑已经换到最后的那个元素,只考虑前 n-1个元素构成的子序列,显然,该子序列已 不是堆,但左、右子树仍为堆,可以将该子序列 调整为堆。 反复做第(2)步,直到剩下的子序列为空为止。 ;调整建堆 输入:完全二叉树数组H(1:n)。其中结点H(m)的左右子树均为堆。 输出:以H(m)为根结点的子树为堆。 PROCEDURE SIFT(H,n,m) t=H(m); j=2m WHILE (j≤n) DO { IF (j<n)and(H(j)<H(j+1)) THEN j=j+1 IF (t<H(j)) THEN { H(m)=H(j); m=j; j=2m } else j=n+1 } H(m)=t RETURN;堆排序 输入:无序序列H(1:n)。 输出:无序序列H(1:n)。 PROCEDURE HEAPSORT(H,n) k=n/2 FOR i=k TO 1 BY -1 DO SIFT(H,n,i) [无序序列建堆] FOR i=n TO 2 BY -1 DO {t=H(1);H(1)=H(i);H(i)=t[堆顶元素换到最后] SIFT(H,i-1,1) [调整建堆] } RETURN ; heapsort(p,n) int n; ET p[]; { int i,k; ET t; k=n/2; for (i=k-1; i>=0; i--) sift(p,n-1,i); /*无序序列建堆*/ for (i=n-1; i>=1; i--) { t=p[0]; p[0]=p[i]; p[i]=t; /*堆顶元素换到最后*/ sift(p,i-1,0); /*调整建堆*/ } return; }; static sift(h,n,m) int n,m; ET h[]; { int j; ET t; t=h[m]; j=2*(m+1)-1; while (j<=n) { if ((j<n)(h[j]<h[j+1])) j=j+1; if (t<h[j]) { h[m]=h[j]; m=j; j=2*(m+1)-1;} else j=n+1; } h[m]=t; return; }

文档评论(0)

1亿VIP精品文档

相关文档