快速排序 --尚硅谷(数据结构和算法)

快速排序也属于交换排序,

基本原理就是每一轮选择一个基准元素(pivot),大于pivot的元素放右边,小于pivot 的元素放左边 ,把数列拆分成两部分--即分治法的思路

 

不明白的地方debug跟踪一下慢慢理解..

int[] arr=new int[8];
        for (int i=0;i<8;i++){
            arr[i]=(int)(Math.random()*100);
        }
        System.out.println("===="+Arrays.toString(arr));
        quick(arr,0,arr.length-1);
        System.out.println("-------------"+ Arrays.toString(arr));
    }

    public static void quick(int[] arr,int left,int right){
        int l = left;//左下标
        int r=right; //右下标
        int temp=0; //临时变量,交换元素
        int pivot=arr[(left+right)/2]; //基准值
        System.out.println("pivot:"+pivot);
        //while 循环的目的是让比pivot小的放左边,比pivot大的放右边
        while (l < r){
            //在pivot左边一直找,找到大于等于pivot值退出
            while(arr[l] < pivot){
                l+=1;
            }
            //在pivot右边一直找,找到大于等于pivot值退出
            while (arr[r] > pivot){
                r-=1;
            }
            //l>r 说明元素完成交换,左边全是小于pivot的值,右边全是大于等于pivot的值
            if(l>=r){
                break;
            }
            //交换元素
            temp=arr[l];
            arr[l]=arr[r];
            arr[r]=temp;
            //完成交换后,如果arr[l]==pivot r下标前移
            if(arr[l] == pivot){
                System.out.println(arr[l]+"LLLLLLLLLLLLLLLL"+pivot);
                r-=1;
            }
            //如果完成交换,发现arr[r]==pivot ,l下标后移
            if(arr[r]==pivot){
                System.out.println(arr[r]+"RRRRRRRRRRRRRRRRR"+pivot);
                l+=1;
            }
        }
        //如果l==r 各自前进一步,避免栈溢出
        if(l==r){
            l+=1;
            r-=1;
        }
        //向左递归
        if (left < r){
            quick(arr,left,r);
        }
        //向右递归
        if (right > l){
            quick(arr,l,right);
        }
    }

 

你可能感兴趣的:(数据结构和算法,快速排序)