什么是归并排序
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序
归并排序的时间以及空间复杂度
归并排序时间复杂度O(n*log(n)),空间复杂度O(n )
归并排序是稳定的排序算法
归并排序的使用
两个有序数组的合并
分析
假设我有数组int[]{1,3,5,2,4,6} 数组长度为length = 6
分割成两个数组变为
arr1[]{1,3,5}
arr2[]{2,4,6}
low mid high三个值分别为0 3 6
然后两个数组分别进行比较
那么代码就可以书写了
修改工具类
public static void merge(int[] arr,int low,int mid,int high)
{
int i = low;
int j = mid + 1;
int[] newArr = new int[high - low + 1];
int index = 0;
while(i <= mid && j <= high)
{
if(arr[i] < arr[j]) newArr[index++] = arr[i++];
else newArr[index++] = arr[j++];
}
if(i > mid)
{
while(j <= high) newArr[index++] = arr[j++];
}
else {
while(i <= mid) newArr[index++] = arr[i++];
}
for(i = 0;i < index ;i++) arr[low + i] = newArr[i];
}
测试
public static void main(String[] args) {
int[] arr = new int[] {1,3,5,2,4,6};
SortUtil.merge(arr, 0,(arr.length - 1)/2 ,arr.length - 1);
StringBuilder sBuilder = new StringBuilder();
sBuilder.append("[");
for (int i : arr) {
sBuilder.append(i);
sBuilder.append(",");
}
sBuilder.reverse();
sBuilder.deleteCharAt(0);
sBuilder.reverse();
sBuilder.append("]");
System.out.println(sBuilder);
}
结果
归并排序
对于归并排序,将已有序的子序列合并,得到完全有序的序列,我们先将一个数组线划分成一个一个的元素,然后两个元素之间进行merge操作,然后分成两个两个的,四个元素进行merge操作,一次递归下去
修改工具类
public static void mergeSort(int[] arr, int low, int high)
{
if(low == high) return;
int mid = (low + high)/2;
mergeSort(arr, low, mid);
mergeSort(arr, mid + 1, high);
merge(arr, low, mid , high);
}
private static void merge(int[] arr,int low,int mid,int high)
{
int i = low;
int j = mid + 1;
int[] newArr = new int[high - low + 1];
int index = 0;
while(i <= mid && j <= high)
{
if(arr[i] < arr[j]) newArr[index++] = arr[i++];
else newArr[index++] = arr[j++];
}
if(i > mid)
{
while(j <= high) newArr[index++] = arr[j++];
}
else {
while(i <= mid) newArr[index++] = arr[i++];
}
for(i = 0;i < index ;i++) arr[low + i] = newArr[i];
}
测试
public class Test {
public static void main(String[] args) {
int[] arr = new int[] {8,3,2,1,7};
SortUtil.mergeSort(arr, 0 ,arr.length - 1);
StringBuilder sBuilder = new StringBuilder();
sBuilder.append("[");
for (int i : arr) {
sBuilder.append(i);
sBuilder.append(",");
}
sBuilder.reverse();
sBuilder.deleteCharAt(0);
sBuilder.reverse();
sBuilder.append("]");
System.out.println(sBuilder);
}
}