
/** * 创建人:yang.liu * 创建时间:2019/7/23 16:27 * 版本:1.0 * 内容描述:对于一个数组,给定一个数组中的元素,将数组中比该数小的放左边,比该数大的放右边。 * 通过快排中的分区思想来做。 */ public class QuicksortPartition { public static void main(String[] args) { int[] arr = {7, 2,1,8,5, 7, 3,7,9,4,6, 7}; solution(arr, 7); System.out.println(Arrays.toString(arr)); } /** * 7, 2, 1, 8, 5, 7, 3, 7, 9, 4, 6, 7, 初始状态是left和cur指向第一个元素位置,right指向最后一个元素的位置。 * [left,cur)之间是维护的是和给定数字7相等的数,cur是每次需要判断是比7大还是小,还是相等。 */ public static void solution(int[] arr, int target) { if (arr == null || arr.length == 0) { return; } int left = 0; int cur = 0; int right = arr.length - 1; while (cur <= right) { if (arr[cur] < target) { // cur比目标数小,把这个小点儿的数换到维护区间的最左边,也就是left的位置。 if (cur != left) { //如果当前没有维护和目标数7相等的区间,就不用交换,此时left和cur位置一样。 swap(arr, left, cur); } cur++; left++; } else if (arr[cur] == target) { // 和目标数相等,直接比较下一个 cur++; } else { //cur比目标数大,就把大的数置换到数组后面,判断置换过来的新的数是大、小还是相等 swap(arr, cur, right); right--; } } } public static void swap(int[] arr, int a, int b) { int temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; } } /** * 执行前:[7, 2, 1, 8, 5, 7, 3, 7, 9, 4, 6, 7] * 执行后:[2, 1, 5, 3, 6, 4, 7, 7, 7, 7, 9, 8] * * 欢迎评论、留言、发表看法。谢谢! */
文章来源: https://blog.csdn.net/qq_36819098/article/details/97015800