快速排序(java)

快速排序:找到基准数据(可以为第一个,也可以为最后一个,也可以为中的数据)在数组的起始位置(左)与数组末尾(右)分别遍历数据与基准位置的数据进行比较;一般将比基准数据大的数据放到数组右边 ,小的放左边,然后对修改后的数据,分别对左半部分和右半部分采用相同的方式进行递归

package Sort;

import java.util.Arrays;

/**
 * @author lxy
 * @version 1.0
 * @date 2020/10/8 20:01
 * 测试快速排序
 */
public class QuickSort{
    public static void main(String[] args) {
        int[] arr = new int[]{8,1,4,0,5,2,-1,-7,6};
        sort(arr,0, arr.length-1);
        System.out.println(Arrays.toString(arr));
    }

    public static void sort(int[] arr , int left ,int right){
        int p = arr[(right+left)/2];
        int l = left;
        int r = right;
        while(l<r){
            //在左面选取比中间的值大的值
            while (arr[l]<p){
                l+=1;
            }
            //在右面选取比中间的值小的值
            while (arr[r]>p){
                r-=1;
            }
            //左边与右边的值进行交换
            int temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
            if (l>=r){
                break;
            }
            //交换完后如果左边的数等于中间的数;只需要对右边的减一
            if (arr[l] == p){
                r-=1;
            }
            //交换完后如果右边的数等于中间的数;只需要对左边的+1
            if (arr[r] == p){
                l+=1;
            }
        }
        //防止递归时栈溢出
        if (l == r) {
            l=l+1;
            r-=1;
        }
        //左边的下标小于右边;对左边部分进行递归排序
        if (left<r){
            sort(arr,left,r);
        }
        //右边的下标大于左边;对右边部分进行递归排序
        if (left<r){
            sort(arr,l,right);
        }

    }


}

优化

package Review;

import java.util.Arrays;

/**
 * @author lxy
 * @version 2.0
 * @date 2020/10/17 21:31
 * 复习快速排序
 */
public class QuickSort {
    public static void main(String[] args) {
        int[] arr = new int[]{0,2,3,1,6,4,5,9,7,8};
        sort(arr,0, arr.length-1);
        System.out.println("----"+Arrays.toString(arr));
    }
    public static void sort(int[] arr,int left,int right){
        int l =left;
        int r = right;
        int temp = arr[(left+right)/2];
        while (l<r){
            while(arr[l]<temp){
                l+=1;
            }
            while(arr[r]>temp){
                r-=1;
            }
            int Temp = arr[l];
            arr[l] = arr[r];
            arr[r] = Temp;
            if (l>=r){
                break;
            }
            if (arr[l] == temp){
                r-=1;
            }
            if (arr[r] == temp){
                l+=1;
            }
            sort(arr,left,r);
            sort(arr,l,right);
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值