使用递归实现快排的两种实现方式:
一、思路1:
- 把首位元素拎出来。
- 然后分别从首尾设置指针向中间移动,begin++、end–,首尾指针分别遇到了比首位元素大、比首位元素小的时候停下,交换该位置的元素。
- 交换完之后继续往中间移动,直到首尾相遇,也就是begin不小于end时,此时begin的位置即为首元素应该所在的位置。
- 然后从该元素的位置分别往前、往后递归。
- 代码如下:
public void quickSort(int[] arr,int begin,int end){
if (begin>=end){
return;
}
int mid = mid(arr,begin,end);
quickSort(arr,begin,mid-1);
quickSort(arr,mid+1,end);
}
private int mid(int[]arr ,int begin,int end){
int _begin=begin;
int t=0;
while (begin<end){
while (begin<end&&arr[begin]<arr[_begin]) begin++;
while (begin<end&&arr[_begin]<arr[end]) end--;
if (begin<end){
t=arr[begin];
arr[begin]=arr[end];
arr[end]=t;
}
}
if (_begin!=begin){
t=arr[begin];
arr[begin]=arr[_begin];
arr[_begin]=t;
}
return begin;
}
二、思路2:
- 数组索引的中间值作为中轴,然后分别从首尾设置指针向中间移动,begin++、end–。
- 首尾指针分别遇到了比中间值大、比中间值小的时候停下,交换该位置的元素。
- 当指针所在位置的值等于中间值时,可以不参与比较,指针继续往中间移动,直到首位相遇。
- 此时如果begin>=end,则代表此时中间值已经被放在了排序后的位置。
- 如果begin==end,则begin++、end–,此时begin的右边和end的左边,分别成为第二层递归的区域
- 代码如下:
public static void quickSort2(int _begin, int _end, int... array) {
int t=0;
int begin = _begin;
int end = _end;
int mid = array[(_begin + _end) / 2];
while (begin < end) {
while (array[begin] < mid) begin++;
while (array[end] > mid) end--;
if (begin >= end) break;
t = array[begin];
array[begin] = array[end];
array[end] = t;
if (array[begin]==mid){
end--;
}
if (array[end]==mid){
begin++;
}
}
if (begin==end){
begin++;
end--;
}
if (_begin < end) {
quickSort2(_begin, end, array);
}
if (_end > begin) {
quickSort2(begin, _end, array);
}
}