划分

一. 快速排序的划分

要求:数组划分分左右两部分,左边比pivot小,右边比pivot大

实现过程:1. 定义变量left,right,分别表示未整理的子数组最左和最右的下标。

     2、定义游标leftPtr,遍历left部分,初始值为left-1;定义游标rightPtr,遍历right部分,初始值为right+1;

     3、++leftPtr,--rightPtr,开始寻找左区第一个大数和右区第一个小数。发现则交换。

     4、直至leftPtr>rightPtr, 或leftPtr,rightPtr跳出边界则终止。

	public static int[] partition(int[] arr, int left, int right, int pivot){
		int leftPtr = left - 1;
		int rightPtr = right + 1;
		
		while(true){
			while(leftPtr < right && arr[++leftPtr] < pivot)
				;
			
			while(rightPtr > left && arr[--rightPtr] > pivot)
				;
			
			if(leftPtr >= rightPtr)
				break;
			else
				swap(arr, leftPtr, rightPtr);
		}
		
		return arr;
	}

  

二、 另一种划分

要求: 划分为3部分,左边小于pivot, 中间等于pivot,右边大于pivot

实现过程:  1、 定义变量left,表左区最右,初始值left = -1;定义变量index,游标;定义变量right,表右区最左,初始值arr.length;

     2、开始遍历。若arr[index] < pivot, 该数放左区,arr[left+1]是中区最左,交换arr[index]和arr[left+1]; index++;

          若arr[index] = pivot,index++;

          若> pivot, 放右区。arr[right-1]是中区最右,交换arr[index] and arr[right-1];此时arr[right-1]值2未知,index不作变动。

   3、当index==right,停止遍历。

	public static void partition2(int[] arr, int pivot){
		int left = -1;
		int right = arr.length;
		int index = 0;
		
		while(index != right){
			if(arr[index] < pivot){
				swap(arr, ++left, index++);
			}	
			else if(arr[index] > pivot)
				swap(arr, --right, index);
			else
				index++;
		}
	}

  

 

posted @ 2017-03-12 10:24  贾斯彼迭  阅读(194)  评论(0)    收藏  举报