算法时间复杂度:o(nlogn);最差o(n2),即每次都是拿到最大或最小的数
算法稳定性:不稳定
思想:每次都取数组的第一个元素作为比较标准(哨兵元素),凡是大于这个哨兵元素的都放在它的右边,凡是小于这个哨兵元素的都放在它的左边
代码:
public static void quicksort(int[] data,int left,int right){
if(left<right){
// 找到基准所在位置 且基准左边的数字都小于基准,基准小于右边的所有数字
int index=getIndex(data,left,right);
// 对基准左边的数据排序
quicksort(data,0,index-1);
// 对基准右边的数据排序
quicksort(data,index+1,right);
}
}
/**
* 0到left,left+1 到right
* @param data
* @param left
* @param right
*/
public static int getIndex(int[] data,int left,int right){
int base=data[left];
while (left <right){
// 从右往左找,一直找到小于基准到为止
while (left <right && data[right] >base){
right--;
}
//右边小于基准的,把小于基准的数,赋值给left所在的位置
data[left]=data[right];
while (left<right && data[left] <base){
left++;
}
//左边大于基准的,把大于基准的数,赋值给right所在的位置
data[right]=data[left];
}
data[left]=base;
System.out.println("finalleft:"+left+"right"+right+"data:"+Arrays.toString(data));
return left;
}
public static void main(String[] args) {
int[] data=new int[]{3,2,4,1,5,0};
quicksort(data,0,data.length-1);
}
网友评论