码迷,mamicode.com
首页 > 编程语言 > 详细

八大基本排序---快速排序(荷兰国旗问题)

时间:2019-05-06 11:56:00      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:lan   height   log   res   inline   数字   int   top   color   

引言:

技术图片

解答:

技术图片

需要准备3个下标

技术图片

如果当前数字=num,cur跳下一个

技术图片

如果数组中的当前数字<num,把这个数(3)和小于区域的下一个数(5)交换

技术图片

然后小于区域扩一下

技术图片

然后cur跳下一个位置

技术图片

数组中的当前数字<num,把这个数(2)和小于区域的下一个数(5)交换,

然后小于区域扩一下

然后cur跳下一个位置

技术图片

PS:

如果一上来遇到的就是cur<num

把这个数(3)和小于等于区域的下一个数(3)交换【自己和自己交换】

技术图片

数组中的当前数字>num,把这个数(7)和大于区域的前一个数(x)交换

然后大于区域向左扩一个位置,more移动一下

然后让cur停留在原地,继续考察换过来的x跟num的大小关系

技术图片

当cur == more的时候,整个过程停止

public class Code_08_NetherlandsFlag {

    public static int[] partition(int[] arr, int L, int R, int num) {
        int less = L - 1;
        int more = R + 1;
        while (L < more) {
            if (arr[L] < num) {
                swap(arr, ++less, L++);
            } else if (arr[L] > num) {
                swap(arr, --more, L);
            } else {
                L++;
            }
        }
        //less + 1:等于区域的第一个位置,more - 1:等于区域的最后 一个位置
        return new int[] { less + 1, more - 1 };
    }

    // for test
    public static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}

传统快排:与荷兰国旗问题类似

技术图片

import java.util.Arrays;

//利用荷兰国旗问题进行快排
public class QuickSort {

    public static void main(String[] args) {
        int[] arr = {3,1,4,5,2,2,0,13};
        System.out.println(Arrays.toString(arr));
//        int[] res = new int[2];
//        res = partition(arr, 0, arr.length-1);
//        System.out.println(res[0]+" " +res[1]);
//        System.out.println(Arrays.toString(arr));
        quickSort(arr, 0, arr.length-1);
        System.out.println(Arrays.toString(arr));
        
    }
    
    public static void quickSort(int[] arr,int L,int R){
        if (L>=R) {
            return;
        }
        int[] p = partition(arr, L, R);
        quickSort(arr, L, p[0]-1);
        quickSort(arr, p[1]+1, R);
    }
    
    //以数组的最后一个数字arr[R]作为num
    //返回等于区域的下标
    public static int[] partition(int[] arr,int L ,int R){
        int less = L-1;
        int more = R+1;
        int num = arr[R];
        while (L < more) {
            if (arr[L]==num) {
                L++;
            }else if (arr[L]<num) {
                swap(arr,++less,L++);
            }else if (arr[L]>num) {
                swap(arr,L ,--more );
            }
        }
        int[] res = {less+1,more-1};
        return  res;
    }
    
    public static void swap(int[] arr, int i, int j ){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

}

八大基本排序---快速排序(荷兰国旗问题)

标签:lan   height   log   res   inline   数字   int   top   color   

原文地址:https://www.cnblogs.com/yuange678/p/10818564.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!