归并排序指的是先用递归分散,再合并的排序方法,直接上代码
public class GuiBingPaiXu { public static void main(String[] args) { int sort[] = {9, 5, 6, 8, 4, 2, 1, 3, 7}; // int sort[] = {9, 5, 6, 8, 0, 3, 7, 1}; mergeSort(sort, 0, sort.length - 1); System.out.println(Arrays.toString(sort)); } public static void mergeSort(int data[], int left, int right) { if (left < right) { // 取中间分割的下标 int mid = (left + right) / 2; // 切分左半边数据 mergeSort(data, left, mid); // 有弹栈的操作 // 切分右半边数据 mergeSort(data, mid + 1, right); // 合并数据 mergeData(data, left, mid, right); } } public static void mergeData(int data[], int left, int mid, int right) { // 定义一个临时数组,用来装数据 int temp[] = new int[data.length]; // 当前数组起始值 int loc = left; // 左半边起始值 int point1 = left; // 右半边其实值 int point2 = mid + 1; // 判断下标是否小于等于临界值 while (point1 <= mid && point2 <= right) { if (data[point1] < data[point2]) { temp[loc] = data[point1]; loc++; point1++; } else { temp[loc] = data[point2]; loc++; point2++; } } // 将左半边还没有变换位置的放到temp数组 while (point1 <= mid) { temp[loc++] = data[point1++]; } // 将右半边还没有变换位置的放到temp数组 while (point2 <= right) { temp[loc++] = data[point2++]; } // 将原本的数组进行排序 for (int i = left; i <= right; i++) { data[i] = temp[i]; } } }
归并排序的切割左边部分、右边部分两个方法不会去同时执行,按照顺序先切割左边数据,再切割右边数据。合并数据时也是先合并左边数据,再合并右边数据。注意方法执行时放在栈中,有弹栈的操作,不会重复的进行if (left < right)的判断,通常是切割左边方法执行完了,执行右边切割方法,然后合并的方法
附一张切割和合并的图: