標籤:排序 劃分
劃分:
指定一個關鍵值key
從左右兩邊進行迴圈劃分操作,將小於等於key的放左邊,大於等於key的放右邊
劃分後的序列不一定全部有序
O(N) 只有一趟排序
/** * 劃分 * * @author stone * @date 2015-7-29 下午4:37:16 */public class Partition {public static void main(String[] args) {int[] ary = Util.generateIntArray(10);Util.printArray(ary);int pivot = 3;int partDex = sort(ary, 0, ary.length - 1, pivot);System.out.println("關索引值是" + pivot + ",劃分的index是" + partDex);Util.printArray(ary);}private static int sort(int[] ary, int left, int right, int pivot) {int leftPtr = left - 1; //左邊 再左一位 操作時需要先++int rightPtr = right + 1; //右邊 再右一位 操作時需要先--while (true) {while (leftPtr < right && ary[++leftPtr] <= pivot); //leftPtr指向的項 > 關索引值 停止while (rightPtr > left && ary[--rightPtr] >= pivot); //rightPtr指向的項 < 關索引值 停止if (leftPtr >= rightPtr) {break;} else {//leftPtr rightPtr 指向的項所在的位置都不正確 應該交換swap(ary, leftPtr, rightPtr);}/* * 繼續下一次迴圈。 前面的錯誤位置的項已經交換了。 左右指標繼續移動 */}System.out.println("l=" + leftPtr + ",r=" + rightPtr);return rightPtr;//返回 leftPtr也可以}private static void swap(int[] ary, int a, int b) {int temp = ary[a];ary[a] = ary[b];ary[b] = temp;}}
輸出
[2, 6, 9, 8, 4, 0, 5, 1, 7, 3]l=3,r=2關索引值是3,劃分的index是2[2, 1, 0, 8, 4, 9, 5, 6, 7, 3]
結果:
在<=index 的位置 <key; 在>index的位置>=key
或
在<=index 的位置 <=key; 在>=index的位置>key
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Java 劃分排序