Java 快速排序,递归排序算法

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("");
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值