快速排序

思想:分治法 ,递归。
直接上代码。

package com.fjf.test;


/**
 * 2018年9月4日 09:46:11
 * @author fjf
 * 快排实现
 * 
 * 
 */
public class QuickSort {


    public static void main(String[] args) {
        int[] a = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
        print("原来的数组:", a);

        quicksort(a,0,a.length-1);
        print("快排后的数组:", a);
    }


    /**
     * 
     * 快排实现
     * @param data
     */
    static void quicksort(int data[],int left, int right){

        int i ,j,temp;

        i=left;
        j=right;

        if(i>j){
            return;
        }

        //temp就是基准位
         temp = data[left];
        while(i<j){
            //先看右边,依次往左递减
            while(temp<=data[j]&&i<j){
                j--;
            }

            //再看左边,依次往右递增
            while(temp>=data[i]&&i<j){
                i++;
            }

            if(i<j){
                int t = data[i];
                data[i] = data[j];
                data[j] = t;
            }
        }

        //i和j相等,此值与基准值交换
        if(i==j){
            data[left] = data[i];
            data[i] = temp;
        }



        //递归调整左边
        quicksort(data,left,i-1);
        //递归调整右边
        quicksort(data,i+1,right);
    }


    static void print(String str, int[] a) {
        System.out.println(str);
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
        System.out.println("\n------------------");
    }

}

这里写图片描述

具体关于快排:网友的帖子:https://blog.csdn.net/as02446418/article/details/47395867

快排为什么要先从右开始:
我的总结: 因为个 i < j的条件,如果从左往右,i已经到了很右边了,j可能因为i < j这个条件,并未找到比基准值小的数而提前中止了查询。
举个例子: 6,2,3,8,9。
如果,先从左边开始。 基准值为6, i 一直走到了8这个位置;右边开始走,9走到8,还未找到比6小的数,但因为此时已经i=j,进行交换。形成了 8,2,3,6,9 的情况,看到出 基准的值的左边并不是都小于它。
如果,正确的做法。 先右边。 j走到3的位置,i开始走,也是在3的位置,不符合i < j 条件,交换,形成 3,2,6,8,9 的情况,正确。
当然,凡事无绝对,也可以从左边开始,这里就不赘述了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值