基本思想
- 将一个数组拆分为两个,从中间点拆开,通过递归操作来实现一层一层拆分。
- 从左右数组中选择小的元素放入到临时空间,并移动下标到下一位置。
- 重复步骤2直到某一下标达到尾部。
- 将另一序列剩下的所有元素依次放入临时空间。
- 将临时空间的数据依次放入原数据数组。
步骤
1.拆分待排序数组
2.合并
实现代码
package com.qcby; import java.util.Arrays; public class ShellSort { // 归并排序 public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 5, 2, 8, 3, 9, 1, 0, 23 }; mergeSort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); } public static void mergeSort(int[] arr, int low, int heigh) { if (low == heigh) { return; } int mid = (low + heigh) / 2; // 拆分 mergeSort(arr, low, mid); mergeSort(arr, mid + 1, heigh); // 合并 merge(arr, low, mid, heigh); System.out.println(Arrays.toString(arr)); } public static void merge(int[] arr, int low, int mid, int heigh) { int s1 = low; int s2 = mid + 1; int[] temp = new int[heigh - low + 1]; int i = 0; while (s1 <= mid && s2 <= heigh) { if (arr[s1] <= arr[s2]) { temp[i] = arr[s1]; i++; s1++; } else { temp[i] = arr[s2]; i++; s2++; } } while (s1 <= mid) { temp[i] = arr[s1]; i++; s1++; } while (s2 <= heigh) { temp[i] = arr[s2]; i++; s2++; } for (int j = 0; j < temp.length; j++) { arr[j + low] = temp[j]; } } }