快速排序快速入门

快速排序

快速排序的基本思想:

1.选一个数作为基准数(一般选取区间的第1个数)
2.把所有比这个大的数放到右边,所有比这个数小的数放到左边
3.以基准数为分界线,分为左右两个区间,重复1和2过程,直到区间的个数只有一个


下面我们就用实例来说明:

我们需要有三个参数,i是区间的开始,j是区间的结束,temp是基准数

第一步:i=0,j=7,temp=12
这里写图片描述

第二步:j往前找,找到第一个比temp小的数就停下来,并且和i的值进行交换
在这里找到比temp小的第一个数就是a[ 5],此时i=0,j=5,temp=12
进行交换

这里写图片描述

第三步:i往后找,找到第一个比temp大的数就停下来,并且和j的值进行交换
在这里找到比temp大的第一个数就是a[ 3],此时i=3,j=5,temp=12
进行交换

这里写图片描述

第四步:j继续往前找,一直找到i=j都没有找到比temp小的数,则停止寻找,第一轮比较结束。此时,所有比temp小的数都在左边,比temp大的数都在右边了。此时,i=j=3,temp=12。

第五步:以3这个索引为分界线,分为[0,2]和[4,7]两个区间,并且一直重复上述步骤,直到子区间只有一个数,不能在分割,下面不再详细说步骤了。

下面就是快速排序的java代码:

public class FastAlgorithm {


    public void sort(int[] arr,int start,int end) {
            //标记第一个位置
            int i = start;
            //标记最后一个的位置
            int j = end;
            //标记基准数
            int first = arr[start];
            while(i<j) {
                //j从右往左递减,和first作比较
                while(j>i && arr[j]>first) {
                    j--;
                }
                //找到第一个比first小的,交换两个数
                if(arr[j]<=first) {
                    swap(arr,i,j);
                    i++;
                }

                //从左往右递增,和first比较
                while(i<j && arr[i]<first) {
                    i++;
                }
                //找到第一个比first大的,交换两个数
                if(arr[i]>=first) {
                    swap(arr,i,j);
                    j--;
                }
            }
            //i=j时,跳出循环
            //递归
            //如果左区间个数不小于一,则递归下去
            if(i>start) 
                sort(arr,start,i-1);

            //如果右区间个数不小于一,则递归下去
            if(j<end) 
                sort(arr,j+1,end);
    }
    /**
     *  交换数组中的两个元素
     * @param arr
     * @param i
     * @param j
     */
    private static void swap(int[] arr,int i,int j) {
        int k;
        k = arr[i];
        arr[i] = arr[j];
        arr[j] = k;
    }

}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值