Java快速排序

package algorithm;

import java.util.Arrays;

public class QuickSort02 {
//快速排序,从数组中选定一个值,将其他小于这个值的元素置于前,否则置于后,依此类推
    public static void main(String[] args) {
        int [] arr={98,1,5,71,46,-1,-67,789,15,64,39,71,46,1};
        quickSort(arr, 0, arr.length-1);
    System.out.println(Arrays.toString(arr));
    }
    public static void quickSort(int []arr,int left,int right){
        
        int l=left,r=right,mid=arr[(l+r)/2];
    /*  mid=(l+r)/2,arr[mid]  这里不能标记mid的索引,然后从数组中按索引取元素,因为在遍历循环的时候数组元素顺序是在变化的,
     * (l+r)/2处的元素会变化    ,所以应该直接将这个值取出来;
     */
        while(l<r){
            //找到左边第一个大于或等于arr[mid]的元素
            while(arr[l]<mid){
                l+=1;
            }
            //找到右边倒数第一个小于或等于arr[mid]的元素
            while(arr[r]>mid){
                r-=1;
            }
            //判断找到的左右元素是否在mid的两边
            if(l>=r) break;
            //确认在两边就开始进行交换
            int temp=0;
            temp=arr[l];
            arr[l]=arr[r];
            arr[r]=temp;
            //因为存在找到的交换元素是等于arr[mid]的情况,所以要进行处理
            if(arr[l]==mid) r-=1;
            if(arr[r]==mid)  l+=1;
        }
        //跳出循环的时候就是l==r;这个时候要处理,让他们交错而过,为递归做准备
        if(l==r) {
            l+=1;
            r-=1;
        }
        //开始递归
        //将第一次排序后的前后数组进行排序;
        if(left<r) quickSort(arr, left, r);
        if(l<right) quickSort(arr,l, right);
    }

}
原文地址:https://www.cnblogs.com/zwwang/p/13274600.html