0
点赞
收藏
分享

微信扫一扫

快速排序三种基准方式学习:通过测试,以左边和右边为基准的效率高于以中间为基准的效率。

小黑Neo 2022-03-30 阅读 58
排序算法

package com.kzhang.sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class QuickSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //快速排序
        /*int[] arr={-9,78,0,0,23,-567,67,87,70};
        quickSort2(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));*/
        //测试
        int[] arr=new int[8000000];
        for(int i=0;i<8000000;i++){
            arr[i]=(int) (Math.random()*8000000);
        }
        Date dat1=new Date();
        SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(format.format(dat1));
        quickSort2(arr,0,arr.length-1);
        Date dat2=new Date();
        System.out.println(format.format(dat2));
    }
    //中间值作为基准值
    public static void quickSort(int[] arr,int left,int right){
        int l=left;//左索引
        int r=right;//右索引
        int pivot=arr[(left+right)/2];//比较基准值:左边小于等于;右边大于等于
        int temp=0;//用于比较
        while(l<r){
            //左边遍历
            while(arr[l]<pivot){
                l++;
            }
            //右边遍历
            while(arr[r]>pivot){
                r--;
            }
            if(l>=r){
                break;
            }
            //交换
            temp=arr[l];
            arr[l]=arr[r];
            arr[r]=temp;
            //当arr[l]=pivot时,可能会出现多个pivot,此时r直接前移
            if(arr[l]==pivot){
                r--;
            }
            //当arr[l]=pivot时,可能会出现多个pivot,此时l直接后移
            if(arr[r]==pivot){
                l++;
            }
        }
        //防止数组溢出
        if(l==r){
            r--;
            l++;
        }
        //左递归
        if(left<r){
            quickSort(arr,left,r);
        }
        //右递归
        if(l<right){
            quickSort(arr,l,right);
        }
    }
    //最左边的值作为基准值
    public static void quickSort1(int[] arr,int left,int right){
        int r=right;
        int l=left;
        int pivot=arr[left];
        int temp=0;
        while(l<r){
            //右边遍历
            while(l<r &&arr[r]>=pivot){
                r--;
            }
            //左边遍历
            while(l<r && arr[l]<=pivot){
                l++;
            }
            if(l<r){
                temp=arr[l];
                arr[l]=arr[r];
                arr[r]=temp;
            }
        }
        arr[left]=arr[l];
        arr[l]=pivot;
        
        if(l==r){
            r--;
            l++;
        }
        //左边递归
        if(left<r){
            quickSort1(arr,left,r);
        }
        //右边递归
        if(l<right){
            quickSort1(arr,l,right);
        }
    }
    //右边的值作为基准值
    public static void quickSort2(int[] arr,int left,int right){
        int r=right;
        int l=left;
        int pivot=arr[right];
        int temp=0;
        while(l<r){
            while(l<r && arr[l]<=pivot){
                l++;
            }
            while(l<r && arr[r]>=pivot){
                r--;
            }
            if(l<r){
                temp=arr[l];
                arr[l]=arr[r];
                arr[r]=temp;
            }
        }
        arr[right]=arr[r];
        arr[r]=pivot;
        if(l==r){
            r--;
            l++;
        }
        //左递归
        if(left<r){
            quickSort2(arr,left,r);
        }
        //右递归
        if(l<right){
            quickSort2(arr,l,right);
        }
    }

}
 

举报

相关推荐

0 条评论