在 读书笔记之快速排序(一)中的 代码1-3用来对一个数组进行快速排序并统计平均比较次数。如果只是想统计比较次数,就不需要对数组实际的排序。代码1-4去掉了对元素进行排序的“实际操作”,只是保留了程序中各种函数调用的框架。

  • 1-4 将 Quicksort 算法的框架缩减为只进行统计

 

 
  
  1. void quicksort(int low,int high) 
  2.     int m; 
  3.     if( low >= high) 
  4.     return ; 
  5.     m = randint(low ,high); 
  6.     comp += high -1; 
  7.     quickcount(low ,high -1); 
  8.     quickcount(m+1,high); 

在实际的程序中,数组的下标(low 和 high)是非常重要的,但在这个框架中并不重要(我们考虑的是比较次数),因此可以用一个表示数组大小的整数 n 来替代这两个下标,如代码 1-5 所示。

  • 1-5 在Quicksort 代码框架中使用一个表示数组大小的参数

 

 
  
  1. void qc(int n) 
  2.     int m; 
  3.     if( n <= low) 
  4.     return ; 
  5.     m = randint(low ,n); 
  6.     comp += n -1; 
  7.     qc(m-1); 
  8.     qc(n-m); 
  9. } 

现在,就可以很自然地把这个过程整理为一个统计比较次数的函数,这个函数讲返回在随机Quicksort算法中的比较次数。1-6给出了这个函数

  • 1-6将 Quicksort框架实现为一个函数

 

 
  
  1. int cc(int n) 
  2.     int m; 
  3.     if(n <= low )     
  4.     return 0; 
  5.     m = randint(low,n); 
  6.     return n-1 + cc(m-1) + cc(n-m);