2.4 快速排序
递归算法:递归就是指方法中调用方法本身的现象。
递归注意事项:递归一定要有出口,否则会有栈内存溢出。出口就是要有停止递归的时候。
递归的两个核心
- 1.找出口
- 2.找规律
方法内部再次调用方法的时候,内部方法的参数要比外部参数的更接近出口。
实例:通过递归方法求阶乘
public static int getFactorial(int number){
if(number==1){ // 递归 出口
return 1;
}
return number * getFactorial(number-1); //内部的递归参数比外部的更接近出口。
}
递归遍历算法:
递归遍历算法描述:
将数组的第一个值作为 一个基准值,分别从前和后两个方向向中间进行遍历,先从end方向开始向前遍历,当遇到比base值小于等于的数据时,就停止进行遍历。然后start方向开始向后遍历,遇到比BaseNumber大的值就停止进行遍历,然后交换start和end对应的值,直到start和end相等时,将start对应的值与baseNumber进行互换。如此我们可以得到一个数组的两边,前端的数据都是比baseNumber小的值,而后端的数据都是比baseNumber大的值。如此就将前后两段的数据再用同等方法进行递归遍历。
public static void main(String[] args) throws ParseException {
// 递归,找出数组中最先存在的
int[] arr = {7,1,4,6,5,8,3,12,8,9,21,4,0,5};
// int[] arr = {7,5};
recursionSort(arr,0,arr.length-1);
}
public static void recursionSort(int[] arr, int start, int end){
System.out.println("开始的start和end"+start+" "+ end);
int i =start, j = end; //将start和end的值保存下来,后面递归调用的时候需要。
if(start>=end){ //如果start的值大于等于end,则直接返回。
return;
}
int baseNumber = arr[start]; // 将start的值赋值给baseNumber作为基准值。
while(start != end){
while(true) {
if(start==end || arr[end]<=baseNumber){ // 如果start==end,或者end对应的值小于等于baseNumber,则停止遍历
break;
}
else{
end--; // 如果遇到的值比baseNumber大,则继续向前遍历。
}
}
while(true){
if(start ==end || arr[start]>baseNumber){ // 如果start==end,或者start对应的值大于baseNumber,则停止遍历。
break;
}
else{
start++; //如果start对应的值比baseNumber小,则继续向前遍历。
}
}
// 当start和end指针都停止的时候,那么久将start和end对应的值进行互换。
int temp = arr[end];
arr[end] = arr[start];
arr[start] = temp;
}
// 当start和end相等的时候,则将start与end对应的值与baseNumber进行互换。
int temp = arr[end];
arr[end] = arr[i];
arr[i] = temp;
// 分前后两段分别递归遍历前后的数组。
recursionSort(arr,i,start-1);
recursionSort(arr,end+1,j);
}
// 定义一个函数,用来输出显示数组信息。
public static void printArr(int[] arr){
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+ " ");
}
System.out.println("");
}