java实现快速排序(partition算法)
partition算法解析
partition算法使用头尾两个方向相反的指针进行遍历,先将数组第一个元素设置为比较元素,头指针从左至右找到第一个大于比较元素的数,尾指针从右至左找到第一个小于比较元素的数,全部交换完毕后将比较元素放到中间位置。
原理解析
算法图解解析
package Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Demo10 {
public static void main(String[] args) {
int arr[]={10,12,11,4,6,5,3,2,7,9,8};
sort(arr);
System.out.println(Arrays.toString(arr));
}
private static void exchange(int[] arr,int i,int j){
int temFront=arr[i];
arr[i]=arr[j];
arr[j]=temFront;
}
private static void sort(int[] arr){
//数组起始位置
int lo=0;
//数组末尾位置
int hi=arr.length-1;
sort(arr,lo,hi);
}
private static void sort(int[] arr, int lo, int hi) {
//安全校验
if(lo>=hi){
return;
}
int partiton = partiton(arr, lo, hi);
//使左子组有序
sort(arr,lo,partiton-1);
//使右子组有序
sort(arr,partiton+1,hi);
}
//对数组进行排序并返回临界值
private static int partiton(int[] arr,int lo,int hi){
//定义两个指针变量
int left=lo+1;
int right=hi;
int key=arr[lo];
while (true){
//找出比key小的元素,如果arr[right]元素比key大则继续循环并且right指针减一
while(arr[right]>key){
right--;
if(right==lo){
break;
}
}
while(arr[left]<key){
left++;
if(left>=hi){
break;
}
}
if(left>=right){
break;
}else{
exchange(arr,right,left);
}
}
exchange(arr,right,lo);
//返回临界值指针
return right;
}
}