第 49 天: 归并排序
/**
* Merge sort recursive.
*
* @param paraStart The start index.
* @param paraEnd The end index.
*/
private void mergeSortRecursive(int paraStart, int paraEnd) {
if (paraStart < paraEnd) {
mergeSortRecursive(paraStart, (paraStart + paraEnd) / 2);
mergeSortRecursive((paraStart + paraEnd) / 2 + 1, paraEnd);
merge(paraStart, (paraStart + paraEnd) / 2, paraEnd);
System.out.println(this);
}// Of if
}// Of mergeSortRecursive
private void merge(int paraLeft, int paraRight, int paraRightEnd) {
DataNode[] tempDataArray = new DataNode[paraRightEnd - paraLeft + 1];
int tempDataArrayIndex = 0, tempLeftIndex = paraLeft, tempRightIndex = paraRight + 1;
// Compare and copy.
while (tempLeftIndex <= paraRight && tempRightIndex <= paraRightEnd) {
if (data[tempLeftIndex].key < data[tempRightIndex].key) {
tempDataArray[tempDataArrayIndex++] = data[tempLeftIndex++];
} else {
tempDataArray[tempDataArrayIndex++] = data[tempRightIndex++];
}// Of if
}// Of while
// Copy to rest data.
while (tempLeftIndex <= paraRight) {
tempDataArray[tempDataArrayIndex++] = data[tempLeftIndex++];
}// Of while
while (tempRightIndex <= paraRightEnd) {
tempDataArray[tempDataArrayIndex++] = data[tempRightIndex++];
}// Of while
System.arraycopy(tempDataArray, 0, data, paraLeft, tempDataArray.length);
}// Of merge
/**
* Merge sort.
*/
public void mergeSort() {
mergeSortRecursive(0, length - 1);
}// Of mergeSort
/**
* Test unit.
*/
public static void mergeSortTest() {
int[] tempUnsortedKeys = {5, 3, 6, 10, 7, 1, 9};
String[] tempContents = {"if", "then", "else", "switch", "case", "for", "while"};
DataArray tempDataArray = new DataArray(tempUnsortedKeys, tempContents);
System.out.println(tempDataArray);
tempDataArray.mergeSort();
System.out.println(tempDataArray);
}// Of mergeSortTest
比较菜,只会写个递归算法,老师那个看着有点头大,回头再研究