java实现快速排序算法 csdn详细文章解读:http://blog.csdn.net/maoyuanming0806/article/details/78167041代码: public class SortTest { /** *title:main *@param args */ public static void main(String[] args) { /* * 获得随机8个
csdn详细文章解读:http://blog.csdn.net/maoyuanming0806/article/details/78167041
代码:
public class SortTest {
/**
*title:main
*@param args
*/
public static void main(String[] args) {
/*
* 获得随机8个0到99之间数的数组
*/
int[] arr = new int[8];
for(int i = 0;i < 8;i++){
arr[i] = (int) (Math.random() * 99);
}
//排序前的输出
for(int a:arr){
System.out.print(a+" ");
}
System.out.println();
quickSort(arr,0,arr.length - 1);
//System.out.println("划分后关键字的位置:"+division(arr, 0, arr.length - 1));
//排序后的输出
for(int a:arr){
System.out.print(a+" ");
}
}
//=======================QUICK SORT=============================================================================
//首先对当前需要快速排序的序列进行一次快排,最后基数的左边全是小的,右边全是大的
//关键步骤:设置关键字、划分、递归
/**
* 快速扫描,划分数组
*title:division
*@param arr 要排序的数组
*@param left 左边界,边界指的是扫描指针的起始位置
*@param right 右边界
*@return 返回本轮扫描后关键字的位置,方便得到子数组的边界位置
*/
public static int division(int[] arr,int left,int right){
int point = right; //选取最右边数为关键字
/*
* 这里为了减少语句,就先设置左边扫描起点-1,右边扫描起点+1,
* 这里由于选取的是最右边的数为关键字,所以右边扫描就是从right-1开始,所以就不需要再减
*/
int leftPre = left - 1;
int rightPre = right;
//让它一直扫描,进行划分
while(true){
/*
* 从左往右扫描,比关键字小就继续扫描,若找到了比关键字大的当前
* 扫描就先停下来,等待交换。这也就是把比关键字小的放在关键字左边
*/
while(leftPre < rightPre && arr[++leftPre] < arr[point]);
/*
* 从右往左扫描,比关键字大就继续扫描,若找到了比关键字小的当前
* 扫描就先停下来,等待交换。这也就是把比关键字大的放在关键字右边
*/
while(leftPre < rightPre && arr[--rightPre] > arr[point]);
//当两个扫描停下来了,如果是leftPre >= rightPre则本轮扫描结束,否则就是需要交换位置了
if(leftPre >= rightPre){
break;
}else{
//如果是等待交换(左扫描找到了比关键字大的或右扫描找到了比关键字小的)那么就交换
int temp = arr[leftPre];
arr[leftPre] = arr[rightPre];
arr[rightPre] = temp;
}
}
/*
* 本轮扫描划分结束,那么关键字就应该出于中间位置,由于选取的是最右边的数做关键字,
* 那么和右边的比关键字大的数组的第一个位置交换即可,也就是和leftPre所在位置的值交换
*/
int temp = arr[leftPre];
arr[leftPre] = arr[point];
arr[point] = temp;
//返回本轮划分的划分点,也就是关键字交换后所在的中间位置
return leftPre;
}
/**
* 递归完成快速排序:左边界至右边界之间的数 构成子数组,进行子数组的快速排序
*title:quickSort
*@param arr 需要排序的数组
*@param left 当前排序的左边界
*@param right 当前排序的右边界
*/
public static void quickSort(int[] arr,int left,int right){
//递归划分,完成排序,递归的出口就是当left>=right时,也就时排序完成了
if(left >= right){
return;
}else{
int pointPosition = division(arr,left,right);
//对划分后关键字左边的数进行排序
quickSort(arr, left, pointPosition - 1);
//对划分后关键字右边的数进行排序
quickSort(arr, pointPosition + 1, right);
}
}
//==========================QUICK SORT 完======================================================================================
}
上方代码一次执行结果:
3 30 52 34 98 54 79 50
3 30 34 50 52 54 79 98
完美排序
