- 1-1 Quicksort函数
- void quicksort(int low,int high)// l是较低的下标,u是较高的下标
- {
- int i,m;
- if(low >= high)
- return ;
- swap(1ow,randint(1ow,high));//第一次交换操作将会按照均匀分布的//方式在low和high之间随机的选择一个划分元素
- m = 1;
- for(i = low+1;i <= high; i++)
- if(x[i] < x[low])
- swap(++m,i);
- swap(low ,m);
- quicksort(low,m-1);
- quicksort(m+1,high);
- }
quicksort对全局数组x[n]进行排序。在最坏的情况下,Quicksort可能需要 n的平方 的时间来对数组进行排序,在最优的情况下,它将选择中值作为划分元素,因此只需要 nlgn 次的比较就可以完成对数组的排序。那么对于不同值得随机数组来说,这个算法平均将进行多少次比较呢?
以下的这段代码是对Quicksort函数的改造,用于统计比较次数,在内部循环进行比较之前,增加变量comp的值。
- 1-2修改Quicksort的内部循环以统计比较次数。
- for(i = low + 1; i <= high;i++)
- {
- comp++;//比较之前增加变量comp++的值
- if(x[i] < x[low])
- swap(++m,i);
- }
如果用一个值 n 来运行程序,将会看到在程序的运行过程中总共进行了多少次比较,如果重复用 n 来运行程序,并且用统计的方法来分析结果,将会得到Quicksort在对 n 个元素进行排序时平均使用来了 1.4nlgn 次的比较。
注:代码1-2还存在一个 运算速度 的问题:由于在循环的内部增加 comp 的值,而内部的循环总会执行 high-1 次比较,因此可以通过在循环外部设置一个简单的操作数来统计比较次数,这样做就可以提高程序的运行速度。代码1-3给出了这个修改。
- 1-3Quicksort的内部循环,将递增操作移到循环的外部。
- comp += high - 1;//将统计次数的变量移到循环外部,提高运行速度
- for(i = low + 1; i <= high;i++)
- {
- if(x[i] < x[low])
- swap(++m,i);
- }
转载于:https://blog.51cto.com/020618/1176415