快速排序的Partition函数(也即有的书中叫分割函数、划分函数)一种实现方法
这种方式不同于以往的两个游标从左右两侧交替比较的方法。而是只是从一侧走向另一侧。不失为一种思路
1. 在书中看到快速排序的Partition一种实现方法。最开始颇为不理解。后来画图试数,不得不承认试数是一种好的理解方式。才发现这种Partition实现方法也是用的两个游标即index和small游标。
2. 两个游标是从一个方向开始走的,即一开始都是从左侧开始走,如果index所指向的元素小于pivot枢纽元素的话,index和small游标一起向右走,当index所指向的元素大于或者等于pivot枢纽元素的话,只是index自己向右走,small不动,这样的话index走啊走啊,相当于把大的数都一个一个的跳过去,一直找比pivot小的数。
3. 发现有一个小于pivot枢纽元素的时候,将此元素与small所指向的元素互换,这样就达到了元素小于pivot枢纽元素再数组的左半部分,元素大于或者等于pivot枢纽元素在数组的右半部分。
int Partition(int data[],int length,int start,int end)
{
if(data==NULL || length<=0||start<0 || end>=length)
{
cout<<"输入数据有误"<<endl;
exit(0);
}
int pivot=RandomInRange(start,end);
swapElements(&data[pivot], &data[end]);
. int small=start-1;
for(int index=start;index<end;index++)
{
//如果index所指向的元素小于pivot枢纽元素的话,index和small游标一起向右走,当index所指向的元素大于或者等于pivot枢纽元素的话,只是index自己向右走,small不动,这样的话index走啊走啊 发现有一个小于pivot枢纽元素的时候,将此元素与small所指向的元素互换
if(data[index]<data[end])
{
++small;
if(small != index)
{
swapElements (&data[index],&data[small]);
}
. }
. }
++small;
//最后把small所指向元素与枢纽元素pivot互换
swapElements (&data[small],&data[end]);
. return small;
}