归并排序
归并排序和快排都是递归算法,但是难点不在递归,而在merge合并函数和partition分区函数。所以就只分析merge函数就可以了。用哨兵比不用哨兵的代码简洁而且更好理解,所以就不解释不带哨兵的合并函数了。
public void mergeWithSentinal(int[] arr, int left, int mid, int right) {
int leftSize = mid - left + 1;
int rightSize = right - mid;
int i, j, k;
int[] tmpLeft = new int[leftSize+1];
int[] tmpRight = new int[rightSize+1];
for(i=0; i < leftSize ; i++) {
tmpLeft[i] = arr[left+i];
}
for(j=0; j < rightSize; j++) {
tmpRight[j] = arr[mid + 1 + j];
}
tmpLeft[leftSize] = Integer.MAX_VALUE;
tmpRight[rightSize] = Integer.MAX_VALUE;
System.out.print("temp left: ");
BubbleSort.showarray(tmpLeft);
System.out.print("temp right: ");
BubbleSort.showarray(tmpRight);
for(k=left,i=0,j=0; k <= right; k++) {
if(tmpLeft[i] < tmpRight[j]) {
arr[k] = tmpLeft[i];
i++;
}
else {
arr[k] = tmpRight[j];
j++;
}
}
System.out.print("arr: ");
BubbleSort.showarray(arr);
}