快排原理:
在要排的数(比如数组A)中选择一个中心值key(比如A[0]),通过一趟排序将数组A分成两部分,其中以key为中心,key右边都比key大,key左边的都key小,然后对这两部分分别重复这个过程,直到整个有序。
整个快排的过程就简化为了一趟排序的过程,然后递归调用就行了。
一趟排序的方法:
1,定义i=0,j=A.lenght-1,i为第一个数的下标,j为最后一个数下标
2,从数组的最后一个数Aj从右往左找,找到第一小于key的数,记为Aj;
3,从数组的第一个数Ai 从左往右找,找到第一个大于key的数,记为Ai;
4,交换Ai 和Aj
5,重复这个过程,直到 i=j
6,调整key的位置,把A[i] 和key交换
public void quickSort(int[]a,int left,int right)
{
if(left>right)
return;
int pivot=a[left];//定义基准值为数组第一个数
int i=left;
int j=right;
while(i<j)
{
while(pivot<=a[j]&&i<j)//从右往左找比基准值小的数
j--;
while(pivot>=a[i]&&i<j)//从左往右找比基准值大的数
i++;
if(i<j) //如果i<j,交换它们
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
a[left]=a[i];
a[i]=pivot;//把基准值放到合适的位置
quickSort(a,left,i-1);//对左边的子数组进行快速排序
quickSort(a,i+1,right);//对右边的子数组进行快速排序
}