快速排序:
以数组中最后一个数为基准值,然后从数组的两头(即 数组下标为0,和下标为arrray.length-1处)分别开始遍历数组,将小于基准值的数放在数组的左边,将大于基准值的数放在数组的右边,最后将基准值放在这两部分中间,最后导致,基准值左边的数都比基准值小,基准值右边的数都比基准值大;
然后从基准值处分为左右两部分,对左边的那一部分数再进行快速排序,对右边的那一部分数也再进行快速排序;递归循环。
比如:数组{1,3,8,2,0,11,6,7,21,9}, 以最右边的数9为基准值,经过一次快速排序,变为:1,3,8,2,0,6,7,9,11,21;则基准值所在的下标变为7,分为两部分,然后将{1,3,8,2,0,6,7}和{11,21}分别再进行快速排序,{1,3,8,2,0,6,7}以7为基准值,{11,21}以21为1基准值,分别进行快速排序;以此类推循环。
private static void quickSort(int[] array){
quickSortInner(array,0,array.length-1);
}
private static void quickSortInner(int[] array,int left,int right){
//当[left,right]之间只剩一个数或没有数存在时,就结束了
if(left==right){
return;
}
if(left>right){
return;
}
//先找出来基准值最终所在的位置
int splitVaule=partion1(array,left,right);
//int splitVaule=partion2(array,left,right);
//int splitVaule=partion3(array,left,right);
//然后再将基准值左边的数组按照前面的方法再次排序,
quickSortInner(array,left,splitVaule-1);
//同理,再将基准值右边的数组按照前面的方法再次排序,
quickSortInner(array,splitVaule+1,right);
}
//获取基准值下标的方法 hover法
private static int partion1(int[] array, int left, int right) {
//以最右边的数为标准,将其它数与其相比较
int vaule=array[right];
int begin=left;
int end=right;
while(begin<end){
while(begin<end&&array[begin]<=vaule){
begin++;
}
while(begin<end&&array[end]>=vaule){
end--;
}
//当begin和end停止继续时,说明不满足左边的比基准值小,右边的比基准值大了
//则将这两个位置的数互换
int t=array[begin];
array[begin]=array[end];
array[end]=t;
}
//将基准值换到begin这个位置
int temp=array[begin];
array[begin]=vaule;
array[right]=temp;
//返回基准值所在的下标
return begin;
}
找出基准值所在的位置的方法还有:挖坑法、前后下边法
挖坑法:
挖坑法与上面的hover法的不同之处就在于:将基准值保存下来,此处就相当于有一个坑,在进行遍历时,每有不满足条件的,就用那个不满足条件的数来填坑,然后不满足条件的数的位置处就变成了一个坑,等待另外一个不满足条件的数来填坑,到最后循环结束时,就用基准值来填剩下的那个坑。
//获取基准值下标的方法 挖坑法
private static int partion2(int[] array, int left, int right) {
//以最右边的数为标准,将其它数与其相比较
int vaule=array[right];
int begin=left;
int end=right;
while(begin<end){
while(begin<end&&array[begin]<=vaule){
begin++;
}
array[end]=array[begin];
while(begin<end&&array[end]>=vaule){
end--;
}
array[begin]=array[end];
}
//将基准值换到begin这个位置
array[begin]=vaule;
//返回基准值所在的下标
return begin;
}
前后下标法:
//获取基准值下标的方法 前后下标法
//0~d之间是小于基准值的,d~i之间是大于基准值的
//将最右边的数作为基准值
private static int partion3(int[] array, int left, int right) {
int d=left;
for(int i=left;i<right;i++){
if(array[i]<array[right]){
//就将这个数移到array[d]的前面,就保证了下标d前面的数都是小于array[right]的
//即 将array[i]与array[d]互换位置
int t=array[d];
array[d]=array[i];
array[i]=t;
//array[d]的位置也后移一位
d++;
}
}
//最后将array[right]与array[d]换一下位置
int temp=array[d];
array[d]=array[right];
array[right]=temp;
return d;
}