思想:将一个数组划分为两个子数组,然后通过递归调用自身为每一个子数组进行快速排序来实现。
如何划分:设置关键字,将比关键字小的数据放在一组,将比关键字大的放在另外一组。
如何自动设置关键字:设置数组最右端的数据为关键字。
package com.chb.chap09;
public class QuickSort {
//划分数组
public static int part(long[]arr,int left,int right,long point) {
int leftPtr=left-1;
int rightPtr=right;
while(true) {
//循环,将比关键字小的留在左边
while(leftPtr<rightPtr&&arr[++leftPtr]<point);
//循环,将比关键字大小的留在右边
while(leftPtr<rightPtr&&arr[--rightPtr]>point);
if(leftPtr>=rightPtr) {
break;
}else {
//交换
long temp=arr[leftPtr];
arr[leftPtr]=arr[rightPtr];
arr[rightPtr]=temp;
}
}
long temp=arr[leftPtr];
arr[leftPtr]=arr[right];
arr[right]=temp;
return leftPtr;
}
//快排
public static void sort(long[]arr,int left,int right) {
if(right-left<=0) {
return;
}else {
//设置关键字
long point=arr[right];
//获得切入点,并对数组进行划分
int p=part(arr,left,right,point);
//对左边的子数组进行快速排序
sort(arr,left,p-1);
//对右左边的子数组进行快速排序
sort(arr,p+1,right);
}
}
public static void main(String[] args) {
long[]arr=new long[10];
for (int i = 0; i < arr.length; i++) {
arr[i]=(long) (Math.random()*99);
}
for (long l : arr) {
System.out.print(l+" ");
}
System.out.println();
System.out.println("++++++++++++++++++++++++++++++++++");
sort(arr,0,arr.length-1);
for (long l : arr) {
System.out.print(l+" ");
}
}
}
运行结果: