思想:
1.选取一个元素(默认从最左边的第一个元素选取)记作temp,保证从数组最右端开始,元素都比temp大,数组左边的元素都比temp小的原则,左右交替向中央移动,当发生碰撞就是temp存储的位置,然后折半,左,右两部分按照之前的逻辑继续执行,直到两部分都收敛。
2.和数组的最右边的元素进行比较:
2.1如果元素大于temp,j--;右边向左边移动一个位置;j--
2.2 如果元素小于temp且i小于j,将位置j的元素赋值给位置i;a[i]=a[j];左边指针向右边移动一个位置,i++;
3.和数组的最左边的元素进行比较
3.1如果元素小于temp,i++;左边向右边移动一个位置;i++
3.2如果元素大于temp且i小于j,将位置i的元素赋值给位置j;a[j]=a[i];右边指针向左边移动一个位置,j--;
4.发生碰撞
i==j;就是temp要存储的位置;
分成左,右两部分,再分别执行上面的逻辑,直到左右两部分都都收敛。
上代码:
package com.ljf.interview.sort;
import java.util.Arrays;
public class FastSort {
public static void main(String args[]){
// int a[]={23,34,45,15,67,98,45,12};
int a[]={2,67,12,89,1,34};
// int a[]={12,98,45,23,67};
show( a, 0,a.length-1);
System.out.println("快速排序:"+ Arrays.toString(a));
}
public static void show(int a[],int start,int end){
if(start<end){//先判断
int i=start;
int j=end;
int temp=a[i];
while(i!=j){
//右边开始
while(i<j&&a[j]>=temp){ //右边只要大于temp,向左边移动
j-- ;
}
if(i<j){
a[i]=a[j];
i++;
}
//左边开始
while(i<j&&a[i]<=temp){//左边只要大于temp,向右边移动
i++;
}
if(i<j){
a[j]=a[i];
j--;
}
}
//发生碰撞
a[j]=temp;
show( a,start,i-1);//左边,递归
show( a,i+1,end);//右边,递归
}
}
}
结果:
sort:[5, 34, 45, 45, 89, 90]