ch10内排序.pptVIP

  • 3
  • 0
  • 约1.13万字
  • 约 73页
  • 2017-12-26 发布于河北
  • 举报
ch10内排序

快速排序算法中一趟使用i,j,temp等3个辅助变量,为常量级。若每一趟排序都将记录序列均匀地分割成2个长度接近的子序列,其深度为O(log2n),所需栈空间为O(log2n)。但在最坏情况下,递归树的高度为O(n)。 快速排序的空间复杂度为O(log2n)。 快速排序是一种不稳定的排序方法。 例如:排序序列{5,2,4,8,7,4},基准为5,在进行划分时,后面的4,放置到前面2的位置上,从而使其放到4的前面。 实际上,在快速排序中,可以以任意一个元素为基准,比如:以当前区间的中间位置的元素为基准,同样可以达到快速排序的目的。教材P285算法。 调整堆算法: void sift(RecType R[],int low,int high) { int i=low, j=2*i; RecType tmp=R[i]; while(j=high) { if(jhigh R[j].keyR[j+1].key) j++; if(tmp.keyR[j].key) { R[i]=R[j]; i=j; j=2*i; } else break; } R[i]=tmp; } void QuickSort(RecType R[],int s,int t) /*对R[s]至R[t]的元素进行快速排序*/ { int i=s,j=t; RecType temp; if (st) /*区间内至少存在2个元素的情况*/ { temp=R[s]; /*用区间的第1个记录作为基准*/ while (i!=j) /*从两端交替向中间扫描,直至i=j为止*/ { while (ji R[j].keytemp.key) j--; if (ij) /*表示找到这样的R[j],R[i]、R[j]交换*/ { R[i]=R[j]; i++; } while (ij R[i].keytemp.key) i++; if (ij) /*表示找到这样的R[i],R[i]、R[j]交换*/ { R[j]=R[i]; j--; } } R[i]=temp; QuickSort(R,s,i-1); /*对左区间递归排序*/ QuickSort(R,i+1,t); /*对右区间递归排序*/ } } 划分 例10.4 设待排序的表有10个记录,其关键字分别为{6,8,7,9,0,1,3,2,4,5}。说明采用快速排序方法进行排序的过程。 设 Tavg(1)≤b 则可得结果: 结论: 快速排序的时间复杂度为O(nlog2n) 由此可得快速排序所需时间的平均值为: 10.4 选择排序 选择排序的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子表的最后,直到全部记录排序完毕。 两种选择排序方法: (1)直接选择排序(或称简单选择排序) (2)堆排序 10.4.1 直接选择排序 直接选择排序的基本思想是: 排序过程: 首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换; 再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换; 重复上述操作,共进行n-1趟排序后,排序结束。 例 初始: [ 49 38 65 97 76 13 27 ] k j j j j j j k k i=1 13 49 一趟: 13 [38 65 97 76 49 27 ] i=2 k k j j j j j 27 38 二趟: 13 27 [65 97 76 49 38 ] 三趟: 13 27 38 [97 76 49 65 ] 四趟: 13 27 38 49 [76 97 65 ] 五趟:

文档评论(0)

1亿VIP精品文档

相关文档