快排的本质是分治的思想,首先选择一个基点,然后比基点小的放在数组的左边,比基点大的放在数组的右边。选择基点的方式有挖坑法和指针交换法,先说挖坑法,
设置两个指针left、right指向数列的最左元素和最右元素,把指针指向的元素和基准元素比较,如果比基准元素大,rigth向左移动,left指向的元素添入坑,中如果比基准元素小,left向右移动则把right指向的元素添入坑
指针交换法:从right开始 ,把指针指向的元素和基准元素进行比较,如果大于等于基准元素,则指针向左移动,如果小于pivot,则right停止移动,切换到left,如果小于基准元素,则left向右移动,如果大于基准元素,则left停止移动,切换到right ,一直这样循环
package shujujiegou;
import java.util.Arrays;
/**
* 快速排序
* @author TomCat
*
*/
public class QuickSort {
public static void quickSort(int[] array,int startIndex,int endIndex) {
if(startIndex>=endIndex) {
//递归结束条件
return;
}
//得到记住基点元素的位置
int pivotIndex=partitiion(array,startIndex,endIndex);
//用分治法递归数列的两部分
quickSort(array, startIndex, pivotIndex-1);
quickSort(array, pivotIndex+1, endIndex);
}
private static int partitiion(int[] array, int startIndex, int endIndex) {
// TODO Auto-generated method stub
//取第一个位置的元素为基准元素
int pivot=array[startIndex];
int left=startIndex;
int right=endIndex;
//坑的位置,初始等于pivot的位置
int index=startIndex;
//大循环在左右指针重合或者交错的时候结束
while(right>=left) {
//right指针从右向左移动
while(right>=left) {
if(array[right]<pivot) {
array[left]=array[right];
index=right;
left++;
break;
}
right--;
}
//left指针从左向右进行比较
while(right>=left) {
if(array[left]>pivot) {
array[right]=array[left];
index=left;
right--;
break;
}
left++;
}
}
array[index]=pivot;
return index;
}
//指针交换法
public static void quickSort1(int[] array,int startIndex,int endIndex) {
if(startIndex>=endIndex) {
return;//递归结束条件
}
int pivotIndex=partition1(array,startIndex,endIndex);
quickSort(array, startIndex, pivotIndex-1);
quickSort(array, pivotIndex+1, endIndex);
}
private static int partition1(int[] array, int startIndex, int endIndex) {
// TODO Auto-generated method stub
int pivot=array[startIndex];//得到基准元素
int left=startIndex;
int right=endIndex;
while(left!=right) {
//控制右指针向左移动
while(left<right&&array[right]>pivot) {
right--;
}
//控制左指针向右移动
while(left<right&&array[left]<=pivot) {
left++;
}
//交换keft和right指向的元素
if(left<right) {
int p=array[left];
array[left]=array[right];
array[right]=p;
}
}
//pivot和指针重合点交换
int p=array[left];
array[left]=array[startIndex];
array[startIndex]=p;
return left;
}
public static void main(String[] args) {
int[] a=new int[] {1,3,2,5,6,7,5,9};
quickSort(a, 0, a.length-1);
System.out.println(Arrays.toString(a));
}
}