Partition函数有两种实现方法,单边扫描和双边扫描
Partition函数的作用就是在数组中选择一个数字,接下来把数组的数字分成两个部分,比选择的数字小的移动到数组的左边,比选择的数字大的移动到数组的右边。
单边扫描:首先随机选择一个数字,与数组最后一个元素进行交换,变量i从左到右进行扫描,每一个数都与最后一个元素进行比较,如果比最后一个元素小,扫描变量i的元素与标记变量small的元素进行交换,同时标记变量small++;如果比最后一个元素大,直接进行i++操作。最后交换最后一个元素和标记变量small对应的元素即可
双边扫描:选择第一个元素,作为标记元素,使用两个变量i,j进行扫描,变量i从左边开始扫描,变量j从右边开始扫描。从右边扫描,如果比标记元素大,则继续扫描j--,直到比标记元素小,则将j对应的元素赋值给i对应的元素。从左边扫描,如果比标记元素小,则继续扫描i++,直到比标记元素大,则将i对应的元素赋值给j对应的元素。
代码实现如下:
//单边扫描
int partition(int array[],int start,int end)
{
if(start>=end)
return;
int index=RandomInRange(start,end);
int indexvalue=array[index];
Swap(&array[index],&array[end]);
int small=strat;
for(int i=start;i<=end;i++)
{
if(array[i]<indexvalue)
{
Swap(&array[i],&array[small]);
small++;
}
}
Swap(&array[small],&array[end]);
return small;
}
//双边扫描
int partition(int array[],int start,int end)
{
int i=start;
int j=end;
int index=start;
if(start>=end)
return;
while(i<j)
{
while(i<j && array[index]<=array[j])
j--;
if(i<j)
array[i++]=array[j];
while(i<j && array[index]>=array[i])
i++;
if(i<j)
array[j--]=array[i];
}
Swap(&array[i],&array[index]);
return i;}