手撕排序-快速排序Java

快速排序
先附赠一张时间复杂度表
在这里插入图片描述图片来源:https://www.cnblogs.com/nannanITeye/archive/2013/04/11/3013737.html

在这里插入图片描述把大象装进冰箱需要几步?恭喜,学会抢答了,三步
那实现快排呢?大体分为四步

第一步:走个形式,用来引出真正得快排!

	public int[] MySort (int[] arr) {
	//引出快排实体
        quickSort(arr,0,arr.length-1);
        return arr;
    }

第二步:写出quickSort方法。quickSort方法需要注意得是,由于快排是不断得将区间分为两部分,因此参数为:int[] arr(数组),int left(区间左,开始),int right(区间右,结束),左闭右闭。

public void quickSort(int[] arr,int left,int right){
        if(left >= right){
            return;
        }
        //具体方法实现,看第三步,partition
        
    }

第三步:第三步是第二步得实现基础。先给代码,再理解。

public int partition(int[] arr,int left,int right){
        int i = left,j = right+1;
        int temp = arr[left];
        while(true){
            while(arr[++i] <= temp) if(i == right) break;
            while(arr[--j] >= temp) if(left == j) break;
            if(i >= j){
                break;
            }
            
            int ex1 = arr[i];
            arr[i] = arr[j];
            arr[j] = ex1;
        }
        int ex2 = arr[left];
        arr[left] = arr[j];
        arr[j] = ex2;
        return j;
    }

快排得思想就是:
1)以left为基准点,进行比较。int temp = arr[left];
2)左侧从left+1开始遍历,直至找到比temp大的值(下标为i);右侧从right开始遍历,直至找到比temp小得值(下标为j)。

	while(arr[++i] <= temp) if(i == right) break;
    while(arr[--j] >= temp) if(left == j) break;

3)对找到得符合条件得下标i、j进行判断,若i > j则break;否则,交换值。
4)注意,不要忘记这里。在将区间遍历结束后,此时i >= j,j所指向得必然是比temp小得值,交换下标j和left对应得值。
5)return j,j将下次快排分为两部分。

第四步:完善第二步。上面提过第三步是实现第二步得基础,通过第三步返回得j,将数组[left,right]分为[left,j-1]和[j+1,right]。对新的到得区间继续快排。

public void quickSort(int[] arr,int left,int right){
        if(left >= right){
            return;
        }
        int j = partition(arr,left,right);
        
        quickSort(arr,left,j-1);
        quickSort(arr,j+1,right);
    }

完整代码如下:我没有将swap()交换值功能单拎出来,但是拎出来更好得。

public int[] MySort (int[] arr) {
        quickSort(arr,0,arr.length-1);
        return arr;
    }
    public void quickSort(int[] arr,int left,int right){
        if(left >= right){
            return;
        }
        int j = partition(arr,left,right);
        
        quickSort(arr,left,j-1);
        quickSort(arr,j+1,right);
    }
    public int partition(int[] arr,int left,int right){
        int i = left,j = right+1;
        int temp = arr[left];
        while(true){
            while(arr[++i] <= temp) if(i == right) break;
            while(arr[--j] >= temp) if(left == j) break;
            if(i >= j){
                break;
            }
            
            int ex1 = arr[i];
            arr[i] = arr[j];
            arr[j] = ex1;
        }
        int ex2 = arr[left];
        arr[left] = arr[j];
        arr[j] = ex2;
        return j;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值