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);
}
}
}