快速排序
快排是一种非常重要的排序方法,必须掌握
首先引入荷兰国旗问题
这里只给出第一问的解题思路,大家可以思考下第二问
第一问:记录小于目标值的边界(起始为-1),从左到右遍历数组,如果小于等于目标值,与边界值下一个数交换位置,边界值++,如果大于目标值则continue
快速排序
O(N2)
public static void main(String[] args) {
int[] arr = new int[]{1,4,2,6,7,9,11,2,4,5};
process(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void process(int[] arr,int start,int end){
if(start>=end){
return;
}
int birge=quicksort(arr, start,end);
swap(arr,start+birge+1,end);
process(arr,start,start+birge);
process(arr,start+birge+2,end);
}
public static int quicksort(int[] arr,int start,int end){
int brige=-1;
for(int i=start;i<end;i++){
if(arr[i]<=arr[end]){
swap(arr,i,start+brige+1);
brige++;
}else{
continue;
}
}
return brige;
}
public static void swap(int[] arr,int i,int j){
int mid=arr[i];
arr[i]=arr[j];
arr[j]=mid;
}
一种比较复杂的排序方法,其思路与上面的荷兰国旗的问题类似
我们要找出当前数组最后一个元素的目标位置(即它左边的数都要小于等于它,它右边的数都要大于它),与该位置交换
我们再以该数为界限,把他左边 看成一个新的数组,右边也看成一个新的数组,调用上述方法
我有一壶酒
足以慰风尘
尽倾江海里
赠饮天下人