zoukankan      html  css  js  c++  java
  • 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);
        }
    
    }
  • 相关阅读:
    [HNOI2002]营业额统计
    HDU 1374
    HDU 3345
    HDU 2089
    Graham扫描法
    Codeforces 1144D Deduction Queries 并查集
    Codeforces 916E Jamie and Tree 线段树
    Codeforces 1167F Scalar Queries 树状数组
    Codeforces 1167E Range Deleting
    Codeforces 749E Inversions After Shuffle 树状数组 + 数学期望
  • 原文地址:https://www.cnblogs.com/zwwang/p/13274600.html
Copyright © 2011-2022 走看看