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)