归并排序算法出现下标越界异常
写归并排序的时候感觉思路一点问题都都没有,但是跑起来时就是下标越界异常,debug很久也没用找到问题,最后通过比对大佬写的代码和我的代码找出问题
以下为出现下标越界异常源代码
public static void mergerSort(int[] arr, int begin, int end) {
// 如果只剩下一个元素,就不用在拆分了,直接返回(递归的返回)
if (end - begin < 2) {
return;
}
int mid = (begin + end) >> 1;
mergerSort(arr, begin, mid);
mergerSort(arr, mid, end);
merger(arr, begin, mid, end);
}
private static void merger(int[] arr, int begin, int mid, int end) {
// 构造指针指向数组
int li = 0;
int le = mid - begin;
int ai = begin;
int ri = mid;
int re = end;
// 构造备用数组
for (int i = 0; i < le; i++) {
leftArray[i] = arr[begin + i];
}
// 进行排序 ,当li = le时,排序完成
while (li < le) {
if (arr[ri] < leftArray[li] && ri < re) {
arr[ai++] = arr[ri++];
} else {
arr[ai++] = leftArray[li++];
}
}
}
其中 == if (arr[ri] < leftArray[li] && ri < re) == 为出错点
应该将代码修改为:
if ( ri < re && arr[ri] < leftArray[li]) {
原因:&&与&是有区别的,&&在前面的条件中错误时,将不再判断后面的条件。所以不会造成下标越界异常。