快速排序--递归法

参考书:《java  数据结构与算法》
package sort;
import java.util.Arrays;
public class QuickSort {
    public static void main(String[] args) {
   //  int arr[]={6,5,7,7,9,2,8,0,3,5};
   //       int arr[]={1,5,7,1,1,1,8,0,3,5};//重复数值

        int arr[]={10,9,8,7,6,5,4,3,2,1};

       partitionIt(arr,0,arr.length-1);
      //  QuickSort(arr,0,arr.length-1 );
        System.out.println (Arrays.toString(arr));
    }

    /*  会造成重复比较

    public  static   int   partition(int[] arr,int left,int right){
      int pivot=arr[right];//指向最后一个
        int   i=0;

        while(left<right){
            i++;
            System.out.println("第"+i+"轮");
         while(left<right&&(arr[left ]<pivot)){
             left++;
         }
         while (left<right&&(arr[right]>=pivot))
         {
             right--;
         }
         int  temp =arr[left];
         arr[left]=arr[right];
         arr[right]=temp;
            System.out.println(" left=" + left +" right ="+right + " "+ Arrays.toString(arr));
         // left++;
        }
        int  temp =arr[left];
        arr[left]=arr[right];
        arr[right]=temp;
        System.out.println("left="+left);


        return   left;
    }*/
    public   static   int partitionIt(int[] arr,int  left,int right){
     // 为什么 j要加1  y因为 j从 --j 和++i 开始的
     // 而基准元素选取第一个元素, 从第二个开始比较

    int  i=  left ;//左游标
    int j=right+1;//右游标

    int   prvoit=arr[left];//基准
        int   n=0;
    while (true){
        System.out.println("第 "+(++n)+"轮");
/*
   //  while (i<j&&( arr[++i]<prvoit)){

     }
    // while (i<j&&(arr[--j])>prvoit){}
*/
         while (i<right&&( arr[++i]<prvoit)){
             System.out.println(" 左边扫描+ i="+i);
         }

        while (j>0&&(arr[--j])>prvoit){
            System.out.println(" 右边扫描+j "+j);
        }

     if(i>=j){
         System.out.println("退出扫描+ i"+i+"j"+j);
         break;
     } else{
         System.out.println("元素交换前:i="+i+" j="+j);
         System.out.println(" i=" + i +" j ="+j + " "+ Arrays.toString(arr));
         swap(arr,i,j);
         System.out.println("元素交换后:i="+i+" j="+j);
         System.out.println(" i=" + i +" j ="+j + " "+ Arrays.toString(arr));
     }
        System.out.println(" i=" + i +" j ="+j + " "+ Arrays.toString(arr));
    }
        System.out.println(" i=" + i +" j ="+j + " "+ Arrays.toString(arr));
        System.out.println(" 准备与基准交换:");
        System.out.println("交换前 i=" + i +" j ="+j + " "+ Arrays.toString(arr));
         swap(arr,left,j);
        System.out.println("交换后  i=" + i +" j ="+j + " "+ Arrays.toString(arr));
        return  j;
    }

    public  static  void  swap(int[] arr,int i,int  j){
        int temp =arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }
     //递归
    public  static   void  QuickSort(int[] arr ,int  left ,int right ){
        if(left>=right){
            return;//递归结束条件
        }
        else{
              int   partition=partitionIt(arr,left,right);//基准位置
              QuickSort(arr,left,partition-1);//左边
              QuickSort(arr,partition+1,right);// 右边
        }
    }


}

 

  int arr[]={1,5,7,1,1,1,8,0,3,5};
partitionIt(int[] arr,int  left,int right)
i=left=0;
j=right+1=11
proit=arr[left]=1;
第 1轮
 右边扫描+j 9
 右边扫描+j 8
元素交换前:i=1 j=7
 i=1 j =7 [1, 5, 7, 1, 1, 1, 8, 0, 3, 5]
                   i                     j
元素交换后:i=1 j=7
 i=1 j =7 [1, 0, 7, 1, 1, 1, 8, 5, 3, 5]
                   i                     j

第 2轮
 右边扫描+j 6
元素交换前:i=2 j=5
 i=2 j =5 [1, 0, 7, 1, 1, 1, 8, 5, 3, 5]
                       i          j 
元素交换后:i=2 j=5
 i=2 j =5 [1, 0, [1], 1, 1, [7], 8, 5, 3, 5]
                        i            j

第 3轮
元素交换前:i=3 j=4
 i=3 j =4 [1, 0, 1, 1, 1, 7, 8, 5, 3, 5]
                       i   j
元素交换后:i=3 j=4
 i=3 j =4 [1, 0, 1, 1, 1, 7, 8, 5, 3, 5]

第 4轮
退出扫描+ i=4j=3
 i=4 j =3 [1, 0, 1, 1, 1, 7, 8, 5, 3, 5]
 准备与基准交换:
交换前 i=4 j =3 [[1], 0, 1, 1, [1], 7, 8, 5, 3, 5]

交换后  i=4 j =3 [1, 0, 1, 1, 1, 7, 8, 5, 3, 5]
[1, 0, 1, 1, 1, 7, 8, 5, 3, 5]
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值