1、浙江万里学院计算机系,1,数据结构课件,内部排序第二讲2004年12月,浙江万里学院计算机系,2,上一讲内容回顾,插入排序 直接插入排序 稳定 T(n)=O(n2)交换排序起泡排序 稳定 T(n)=O(n2) 原表有序时 T(n)=O(n)快速排序 不稳定 O( n.log2n) 原表有序时 T(n)=O(n2),浙江万里学院计算机系,3,本讲内容,选择排序简单选择排序 稳定 T(n)=O(n2) 堆排序 不稳定 T (n)= O( n.log2n) 归并排序 两路归并排序 稳定T (n)= O( n.log2n),浙江万里学院计算机系,4,9.4 选择排序,一、简单选择排序:思路: 组织外循
2、环(趟) i=1, n-1 每趟:从ri,ri+1,.,rn 选关键字最小值的记录放ri ;算法分析,时间复杂度: T(n)=O(n2) 排序稳定,浙江万里学院计算机系,5,一、简单选择排序算法,void smp_selecpsort(listtp r) for ( i=1; i=n-1 ; i+) k=i; /* 记下较小值的下标 */ for ( j=i+1; j=n; j+) if ( rj.keyrk.key) k=j; if ( k!=i ) x=rk; rk=ri; ri=x; /* smp _selecpsort */,浙江万里学院计算机系,6,二、堆排序:,1. 堆的概念: n
3、个元素序列k1,k2,.,kn, 当且仅当满足: ki=k2i (i=1,2,. , n/2 ) kix.key) bool=1; /* 已是堆关系*/ else ri=rj ; i=j; j=2*i; /* 较小数上移,向下搜索 */ /* i是j的双亲结点号,i是结果位置 */ ri=x; /* heappass */,(1)堆内核心算法,处理ri到rm序列,浙江万里学院计算机系,22,void heapsort(listtp r) /* 初建堆 */ for ( i= n/2 ; i=1; i-) heappass(r,i,n); /*输出堆顶元素,调整堆逻辑堆尾下标m不断变小*/ fo
4、r ( m=n-1; m=1; m-) printf(“n %d”, r1.key); x=r1; r1=rm+1; rm+1=x; /* 堆顶堆尾元素对换 */ heappass(r,1,m); /* 恢复堆 */ printf(“n %d”, r1.key); /* heapsort */,(2) 堆排序主体算法,浙江万里学院计算机系,23,4. 堆排序算法 分析:,(1)因为主体算法:O(n) 子算法:O( log2n)与堆深有关。 所以 T(n)=O(n.log2n) 当n 大时算法很快。 在各种情况下T(n)大体不变。(2) 空间:占用一个(记录); (3)不稳定。;,浙江万里学院计算机系,24,作业: P70 9.3 快速;堆;归并排序;,掌握基本思路,熟练手工表示; 能读懂、识别、分析算法; 上机运行比较不同算法优劣;,