快速排序(java实现)

一、快速排序(递归)

// left right为数组第0个和最后一个索引
public int[] quicksort(int[] nums, int left, int right){
    if(left > right) return nums;
    int i = left ;
    int j = right ;
    int tmp = nums[left];
    // 找到数组中小于tmp和大于tmp的下标索引
    while(i != j){
        // 先从右向左查找小于tmp的下标索引
        while(i < j && nums[j] >= tmp) j--;
        // 先从左向右查找大于tmp的下标索引
        while(i < j && nums[i] <= tmp) i++;
        if(i < j){
            int tp = nums[i];
            nums[i] = nums[j];
            nums[j] = tp;
        }
    }
    // 查找成功后,分治处理tmp左右两部分
    nums[left] = nums[i];
    nums[i] = tmp;
    quicksort(nums, left, i - 1);
    quicksort(nums, i + 1, right);
    return nums;
}

思考:

  1. 为什么先从右向左(先从左向右怎样写)?
  2. 为什么nums[j] >= tmp和nums[i] <= tmp需要等号?
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 手串问题标准全提取 #include #include void getMaxCommonSubstring(ch...
    轻哨微风阅读 153评论 0 0
  • 以前看到一个故事 讲的是左先生与右先生 吵架的时候左先生会说 “对不起我错了以后再也不会了” 右先生会说 “别生气...
    糖呗科技阅读 90评论 0 0
  • 练习材料 Lesson36 Across the Channel Debbie Hart is going to ...
    喵小园upup阅读 239评论 0 1
  • 每个人都有很多代号,名字是大家通常使用的代号,另外还有可以代表身份的身份证号,在学校有代表学生身份的学生证的号码,...
    你爸爸的daddy阅读 1,073评论 0 0
  • 20岁的我喜欢上了一个中年男人,我想和他在一起,结婚,生小孩。 我妈知道这个消息后,差点没有气晕过去,甚至以死相逼...
    麦芽糖阅读 188评论 0 0