快速排序 简单实现以及遇到越界问题

public static void quick(int low, int high, int[] arr) {
    int i = low;
    int j = high;
    if (low < high) {
        int temp = arr[i];//不能置于if语句外 
        while (i < j) {
            while (i < j && temp <= arr[j]) {
                j--;
            }
            arr[i] = arr[j];
            while (i < j && temp >= arr[i]) {
                i++;
            }
            arr[j] = arr[i];
            arr[i] = temp;
        }
        quick(low, i - 1, arr);
        quick(i + 1, high, arr);
    }
}

注释处代码 若在if语句外会报java.lang.ArrayIndexOutOfBoundsException 因为在对最后一个数执行quick方法时 i+1已经大于数组最大下标arr.length 执行int temp =arr[i] 时则会报越界

实现过程原理:

开始时 设置 i 和  j 分别指向数组的头和尾的下标 并且设置一个  temp作为一次过程的比较值,这里就选取数组第一个作为比较值

开始准备

比较过程

①temp会与j对应下标值的元素进行比较 ,如果j对应元素arr[j]小于temp ,arr[j]就会将值赋给arr[i] ,然后执行下面②,如果j对应元素arr[j]大于temp ,就会执行j--,向前移动一位 ,如果找到小于temp的元素,则将值赋给arr[i],然后j就停止移动 ,然后执行下面②,如果没找到就接着往前找,直到j=i为止;

②i的操作与j相反,i则是从头开始, 如果arr[i]大于temp,arr[i]就会把值赋给arr[j],然后执行下面③,如果i对应元素arr[i]小于temp,就会执行i++,向后移动一位,如果找到大于temp的元素,则将值赋给arr[j],然后i就停止移动,然后执行下面③,如果没找到就接着往后找,直到j=i时停止;

③执行完①②操作后 再将temp保存的值赋给arr[i] ,一轮比较就结束了

④ 下面操作则是以上次i对应的位置作为分界线,分别对i前面以及i后面的数组进行①②③操作

时间复杂度

平均为O(nlogn),最好为O(nlogn),最差为:O(n^2)

猜你喜欢

转载自blog.csdn.net/qq_41800087/article/details/89422016
今日推荐