1 划分算法思想
划分(partition)就是将数据项分成两组,一组大于某个特定的数据项,而另一组小于某个特定的数据项。在划分算法中,这个特定的数据项叫做枢纽(pivot)。
划分算法的思想是中间线代表枢纽;数据项的左端和右端分别有两个指针(leftPtr和rightPtr); leftPtr从左向右遍历元素,rightPtr从右向左遍历元素,当leftPtr遇到比枢纽元素大的元素时停止,当rightPtr遇到比枢纽元素小的元素时停止,然后将这两个元素交换位置;接下来,leftPtr继续向右遍历,rightPtr继续向左遍历,重复上面的操作;当两个指针相遇时遍历结束。
2 代码实现
//返回划分后pivot的位置pivotIndex,位于pivotIndex左边的数字小于pivot,右边的大于pivot
public static int partionIt(int[] a,int left, int right, long pivot) {
int leftPtr=left-1;
int rightPtr=right+1;
while(true)
{
//from left to pivot
while(leftPtr<right && a[++leftPtr]<pivot);
//from right to pivot
while(rightPtr>left && a[--rightPtr]>pivot);
//base case
if(leftPtr>=rightPtr)
break;
//swap
else
swap(a,leftPtr,rightPtr);
}
return leftPtr;
}
private static void swap(int[] a,int left, int right)
{
int temp=a[right];
a[left]=a[right];
a[right]=temp;
} //end swap()
} //end partionIt
3 时间复杂度
算法时间复杂度O(N)。当在划分的2端有相同的数据需要比较和交换时,比较和交换各位N