<>快速排序&&荷兰国旗&&

2019-03-04 10:37:32 浏览数 (1)

一.partition操作

代码语言:javascript复制
private void swap(int[] array,int i ,int j){
    int temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}

public void partition(int [] array,int left ,int right,int num){
    int less = left - 1;
    int more = right   1;
    int cur = left;
    while (cur < more){
        if (array[cur] < num){
            swap(array,cur  ,  less);
        }else if (array[cur] > num){
            swap(array,cur,--more);
        }else {
            cur  ;
        }
    }
}

小于区域推着等于区域往右跑,但是等于区域与大于区域之间有一个待定的区域,所以array[cur]< num时候cur ,所以array[cur] > num时候cur不用加一。

初始状态:

执行状态:

二.经典快速排序和随机快排

代码语言:javascript复制
public void quickSort(int[] array,int left ,int right){
    if (right <= left) return;
    // 让数组中的一个随机位置的数字与数组中的最后的一个数字交换,这一个语句就是随机快排的核心,可以有效的加速
    //近似有序的数组的排序
    swap(array,left   new Random().nextInt(right - left   1) ,right);
    int[] p = partition(array,left,right);
    quickSort(array,left,p[0]-1);
    quickSort(array,p[1] 1,right);
}

public int [] partition(int [] array,int left ,int right){
    int less = left - 1;
    // 因为这里的数组中的最后一个数字作为了num,所以这里的more初始化应该为right,而不再是right 1;
    int more = right;
    int cur = left;
    while (cur < more){
        if (array[cur] < array[right]){
            swap(array,cur  ,  less);
        }else if (array[cur] > array[right]){
            swap(array,cur,--more);
        }else {
            cur  ;
        }
    }
    //这里选择数组中的最后一个数字作为比较的num,所以在最后需要将这个数字与more位置的数字交换。
    swap(array,more,right);
    //由于more与最后一个数字交换,说明more是等于num的最后一个数字,因此,等于num的下标范围是 less 1 .. more
    // 这就是为什么不是more-1的原因
    return new int[]{less 1,more};
}

这里选择数组中的最后一个数字作为比较的num,所在最后需要将这个数字与more位置的数字交换。

每次返回的是等于这个数字的的起始和终点的位置。

0 人点赞