快速排序是一种冒泡排序,只是把将要排序的数据分成了两组,然后通过冒泡排序进行排序,然后左边的数通过递归再次排序,右边也一样通过递归两次排序,最后得到结果。
图解:
package com.demo.sort;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class QuickSort {
public static void main(String[] args) {
// int[] arr={-9,78,0,23,-567,70};
int[] arr=new int[8];
for (int i = 0; i < arr.length; i++) {
arr[i]=(int)(Math.random()*10);
}
Date date=new Date( );
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("YY-MM-DD-HH:MM:SS");
String format = simpleDateFormat.format( date );
System.out.println( "测试前的时间是" + format );
quickSort( arr,0,arr.length-1 );//注意是arr.length-1不是arr.length
Date date1=new Date( );
String format1 = simpleDateFormat.format( date1 );
System.out.println( "排序后的时间是"+format1 );
System.out.println( Arrays.toString( arr ) );
}
public static void quickSort(int[] arr,int left,int right){
int l=left;
int r=right;
/*中轴值*/
int pivot=arr[(left+right)/2];
// 循环把比pivot小的值放到pivot左边,大的放到右边
while(l<r){
// 从左边开始找,直到找到比pivot的大的值才退出
while(arr[l]<pivot){
l++;
}
// 从右边开始找,直到找到比小的值才退出
while(arr[r]>pivot){
r--;
}
int temp=0;//用来把两个数交换位置
temp=arr[l];
arr[l]=arr[r];
arr[r]=temp;
//说明已经比较完毕,可以退出
if(l>=r){
break;
}
// 如果交换完后发现这个arr[l]==pivot,则l往右偏移
if(arr[l]==pivot){
r--;
}
if (arr[r]==pivot){
l++;
}
}
// 左右的两边的数已经分组,可以继续左边,右边的数排序
// l==r也满足条件,所以必须让它们执行下面的条件
// !!!小心 没有加上这个会出现
/* Exception in thread "main" java.lang.StackOverflowError
at com.demo.sort.QuickSort.quickSort(QuickSort.java:54)*/
if(l==r){
l++;
r--;
}
// 此时只是分成了左右两边的数,但是左右的数并没有排序好
// 递归排序左边的数和右边的数
//这个r已经找出了的的
if(left<r){
quickSort( arr,left,r );
}
if(right>l){
quickSort( arr,l,right);
}
}
}