快速排序(填坑法+递归)
上次已经介绍过快速排序的基本思想所以这次不做赘述。其实基本思想一致只是实现稍有不同而。
原数组:
挖坑 : 去除left的值作为key
填坑 : 因为3<4(key) arr[left] = arr[right];
继续填坑 : 因为8>4(key) arr[right] = arr[left];
相遇
这是一次操作,然后将3设为基准值(key)重复此操作直至数组有序。
public static void quickSort(int[] arr,int left,int right){
if(left < right) {
int mid = partion2(arr,left,right);
quickSort(arr,left, mid - 1);
quickSort(arr, mid + 1, right);
}
}
public static int partion2(int[] arr,int left,int right){
//获取基准值
int key = arr[left];
//挖坑填坑
while(left < right){
//从右边第一个小于key的数据,填左边的坑
while(left < right && arr[right] >= key)
--right;
//填坑
arr[left] = arr[right];
//从左边找第一个大于key的数据,填右边的坑
while(left < right && arr[left] <= key)
++left;
//填坑
arr[right] = arr[left];
}
//填基准值到中间相遇的位置
arr[left] = key;
return left;
}
这种放法和Hoare法类似也是先选取left做基准值在进行前后遍历,利用递归方可实现快速排序。