荷兰国旗问题,对于一个数组,给定一个数组中的元素,将数组中比该数小的放左边,比该数大的放右边。

匿名 (未验证) 提交于 2019-12-02 23:51:01

版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons
/**  * 创建人: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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!