前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 ><>快速排序&&荷兰国旗&&

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

原创
作者头像
大学里的混子
修改2019-03-04 10:37:32
4470
修改2019-03-04 10:37:32
举报
文章被收录于专栏:LeetCodeLeetCode

一.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位置的数字交换。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.partition操作
  • 二.经典快速排序和随机快排
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档