下面是快速排序的伪代码,请填补其中的空缺;伪代码中的主要变量说明如下。 A:待排序数组 p,r: 数组元素下标,从p到r q: 划分的位置 x:枢轴元素 i:整型变量,用于描述数组下标。下标小于或等于i的元素的值小于或等于枢轴

admin2009-01-10  42

问题 下面是快速排序的伪代码,请填补其中的空缺;伪代码中的主要变量说明如下。
   A:待排序数组
   p,r: 数组元素下标,从p到r
   q: 划分的位置
   x:枢轴元素
   i:整型变量,用于描述数组下标。下标小于或等于i的元素的值小于或等于枢轴元素的值
   j:循环控制变量,表示数组元素下标
   QUICKSORT (A,p,r){
       if  (p <r){
           q=PARTITION(A,p,r) ;
           QUICKSORT(A,p,q-1);
           QUICKSORT(A,q+1,r);
       }
   }
   PARTITION(A,p,r){
       x=A[r];i=p-1;
       for(j=p;j≤r-1;j++){
           if  (A[j]≤x){
               i=i+1;
               交换A和A[j]
       }
       }
       交(1)和(2)//注:空(1)和空(2)答案可互换,但两空全部答对方可得分 return  (3)  
   }

(1)待排序数组是否能被较均匀地划分对快速排序的性能有重要影响,因此枢轴元素的选取非常重要。有人提出从待排序的数组元素中随机地取出一个元素作为枢轴元素,下面是随机化快速排序划分的伪代码——利用原有的快速排序的划分操作,请填充其中的空缺处。其中,RANDOM(i,j)表示随机取i到j之间的一个数,包括i和j。
   RANDOMIZED- PARTITION(A,p,r){
      i=RANDOM(p,rl);
      交换(8)和(9);//注:空(8)和空(9)答案可互换,但两空全部答对方可得分
   return PARTITION (A,p,r);
   }
(2)随机化快速排序是否能够消除最坏情况的发生?(10)。(是或否)

选项

答案(8)A[i] (9)A[r] (10)否 注;空(8)和空(9)答案可以互换

解析 本题考查算法的设计与分析技术。
   问题1考查快速排序算法的伪代码,快速排序最核心的处理是进行划分,即 PARTITION操作,根据枢轴元素的值,把一个较大的数组分成两个较小的子数组,一个子数组的所有元素的值小于等于枢轴元素的值,一个子数组的所有元素的值大于枢轴元素的值,而子数组内的元素不排序。划分时,以最后一个元素为枢轴元素,从左到右依次访问数组的每一个元素,判断其与枢轴元素的大小关系,并进行元素的交换,如图4-1所示:
      
   在问题1给出的伪代码中,当循环结束后,A[p..i]中的值应小于等于枢轴元素值x,而A[i+1..r-1]中的值应大于枢轴元素值x。此时A[i+1)是第一个比A[r]大的元素,因此 A闭与A[i+1]交换,得到划分后的两个子数组。PARTITION操作返回枢轴元素的位置,因此返回值为i+1。
   问题2考查的是快速排序算法的时间复杂度分析。当每次能作均匀划分时,算法为最佳情况,此时时间复杂度可以通过计算递归式T(n)=2T(n/2)+O(n),得到时间复杂度为O(nlgn):当每次为极端不均匀划分时,即长度为n的数组划分后一个子数组为n-1,一个为0,算法为最坏情况,此时时间复杂度可以通过计算递归式T(n)=T(n-1)+O(n),得到时间复杂度为O(n2);平均情况的分析较为复杂,我们可以假设数组每次划分为 9/10:1/10,此时时间复杂度可以通过计算递归式T(n)=T(9/10)+T(1/10)+O(n),得到时间复杂度为O(nlgn),因此在平均情况下快速排序仍然有较好的性能,时间复杂度为 O(nlgn)。当所有的n个元素具有相同的值时,可以认为数组已经有序,此时每次都划分为长度为n-1和0的两个子数组,属于最坏情况。
   问题3中,由于随机化的快速排序的划分调用了传统的快速排序算法的PARTITION操作,而传统的划分每次以数组的最后一个元素作为枢轴元素,因此,随机化的划分操作中每次先随机获得一个元素,将其与最后一个元素交换。随机化的快速排序消除了输入数据的不同排列对算法性能的影响,降低了极端不均匀划分的概率,但不能保证不会导致最坏情况的发生。
转载请注明原文地址:https://kaotiyun.com/show/W5DZ777K
0

相关试题推荐
最新回复(0)