java 中常见的排序——归并排序
归并排序的基本思想与概述
归并排序:也叫归并算法,简而言之就是将两个(或者两个以上)有序的序列合并成一个有序序列。
代码
public class MergeSortDemo {
public static void main(String[] args) {
int[] arr = { 3, 1, 5, 2, 7, 6, 8, 4, 3, 9 };
System.out.println("排序前");
printArray(arr);
System.out.println("归并排序后");
int[] temp = new int[arr.length];
mergeSort(arr, 0, arr.length - 1, temp);
printArray(arr);
}
private static void mergeSort(int[] arr, int left, int right, int[] temp) {
if (left < right) {
int mid = (left + right) / 2;
System.out.println("mid: "+mid);
mergeSort(arr, left, mid, temp);
mergeSort(arr, mid + 1, right, temp);
merge(arr, left, mid, right, temp);
}
}
private static void merge(int[] arr, int left, int mid, int right, int[] temp) {
int leftPointer = left;// 左序列指针
int rightPointer = mid + 1;// 右序列指针
int tempPoint = 0;// 临时数组指针
while (leftPointer <= mid && rightPointer <= right) {
if (arr[leftPointer] <= arr[rightPointer]) {
temp[tempPoint++] = arr[leftPointer++];
} else {
temp[tempPoint++] = arr[rightPointer++];
}
}
while (leftPointer <= mid) {// 将左边剩余元素填充进temp中
temp[tempPoint++] = arr[leftPointer++];
}
while (rightPointer <= right) {// 将右序列剩余元素填充进temp中
temp[tempPoint++] = arr[rightPointer++];
}
tempPoint = 0;
// 将temp中的元素全部拷贝到原数组中
while (left <= right) {
arr[left++] = temp[tempPoint++];
}
}
/**
* 交换arr数组中下标x 和 y的元素位置
*
* @param arr
* @param x
* @param y
*/
private static void swap(int[] arr, int x, int y) {
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
/**
* 输出数组arr中的元素
*
* @param arr
*/
private static void printArray(int[] arr) {
for (int i : arr) {
System.out.print(i + " ");
}
System.out.println();
}
}