-
单指针扫描:p1扫描数组,p2指向数组尾部,p1扫描到比pivot小的数则与p2元素交换,p2左移
public static int partition1(int[] arr, int left, int right) { int p1 = left + 1; int p2 = right; int pivot = arr[left]; while(p1 <= p2) { if(arr[p1] >= pivot) { Util.swap(arr,p1,p2); p2--; } else p1++; } Util.swap(arr,left,p2); return p2; }
-
双指针扫描:p1从左往右扫描到大的元素停下,p2从右往左扫描到小的元素停下,p1、p2同时停下后交换p1和p2指向的元素
public static int partition2(int[] arr, int left, int right) { int p1 = left + 1; int p2 = right; int pivot = arr[left]; while(p1 <= p2) { while(p1 <= p2 && arr[p1] <= pivot) p1++; while(p1 <= p2 && arr[p2] > pivot) p2--; if(p1 <= p2) Util.swap(arr,p1,p2); } Util.swap(arr,left,p2); return p2; }
-
双指针扫描和一个判等指针:三个while循环,(p1从左往右扫描,遇到等于或者大于pivot的数停下),(当p1扫描到等于pivot的数时,equal指针移动到p1处,p1右移后停下),(p2从右往左扫描遇到小于pivot的数停下)
public static int partition3(int[] arr, int left, int right) { int p1 = left + 1; int p2 = right; int equal = left + 1; int pivot = arr[left]; while(p1 <= p2) { while(p1 <= p2 && arr[p1] < pivot) p1++; while(p1 <= p2 && arr[p2] >= pivot) p2--; while(p1 <= p2 && arr[p1] == pivot) { equal = p1; p1++; } //如果p1因为遇到大数且和p2同时停下 if(p1 <= p2 && arr[p1] > pivot && arr[p2] < pivot) Util.swap(arr,p1,p2); //如果p1因为遇到等于pivot的数右移后停下 else if(p1 <= p2 && arr[equal] < arr[p1]) Util.swap(arr,equal,p1); } Util.swap(arr,left,p2); return p2; }
partition分区(左小右大)
最新推荐文章于 2021-12-24 12:00:27 发布