• 1-1 Quicksort函数

 

  1. void quicksort(int low,int high)// l是较低的下标,u是较高的下标 
  2.     int i,m; 
  3.     if(low >= high) 
  4.         return ; 
  5.     swap(1ow,randint(1ow,high));//第一次交换操作将会按照均匀分布的//方式在low和high之间随机的选择一个划分元素 
  6.     m = 1; 
  7.     for(i = low+1;i <= high; i++) 
  8.          if(x[i] < x[low]) 
  9.                 swap(++m,i); 
  10.     swap(low ,m); 
  11.     quicksort(low,m-1); 
  12.     quicksort(m+1,high); 

quicksort对全局数组x[n]进行排序。在最坏的情况下,Quicksort可能需要 n的平方 的时间来对数组进行排序,在最优的情况下,它将选择中值作为划分元素,因此只需要 nlgn 次的比较就可以完成对数组的排序。那么对于不同值得随机数组来说,这个算法平均将进行多少次比较呢?

以下的这段代码是对Quicksort函数的改造,用于统计比较次数,在内部循环进行比较之前,增加变量comp的值。

  • 1-2修改Quicksort的内部循环以统计比较次数。

 

  1. for(i = low + 1; i <= high;i++) 
  2.     comp++;//比较之前增加变量comp++的值 
  3.     if(x[i] < x[low]) 
  4.     swap(++m,i); 

如果用一个值 n 来运行程序,将会看到在程序的运行过程中总共进行了多少次比较,如果重复用 n 来运行程序,并且用统计的方法来分析结果,将会得到Quicksort在对 n 个元素进行排序时平均使用来了 1.4nlgn 次的比较。

:代码1-2还存在一个 运算速度 的问题:由于在循环的内部增加 comp 的值,而内部的循环总会执行 high-1 次比较,因此可以通过在循环外部设置一个简单的操作数来统计比较次数,这样做就可以提高程序的运行速度。代码1-3给出了这个修改。

  • 1-3Quicksort的内部循环,将递增操作移到循环的外部。

 

  1. comp += high - 1;//将统计次数的变量移到循环外部,提高运行速度 
  2. for(i = low + 1; i <= high;i++) 
  3.     if(x[i] < x[low]) 
  4.     swap(++m,i);