与之前的排序不同,归并排序采用分而治之的算法设计思想,最终的时间复杂度为;
归并排序的实现步骤:
1.分割:不断的将数组分割成两个新数组,直到长度为1;
2.合并:合并的过程也就是排序的过程,将两个数组按元素大小顺序合并成一个新数组,直到全部合并;
实现原理如下图:
实现归并排序的简单程序如下:
// 分割方法
public static int[] mergeSort(int[] arr)
{
if (arr.length > 1)
{
int[] firstHalf = new int[arr.length / 2];
System.arraycopy(arr, 0, firstHalf, 0, arr.length / 2);
// 继续分割前半段
mergeSort(firstHalf);
int secondHalfLen = arr.length - arr.length / 2;
int[] secondHalf = new int[secondHalfLen];
System.arraycopy(arr, arr.length / 2, secondHalf, 0, secondHalfLen);
// 继续分割后半段
mergeSort(secondHalf);
// 分割之后调用合并方法
merge(firstHalf, secondHalf, arr);
}
return arr;
}
// 合并方法
public static void merge(int[] arr1, int[] arr2, int[] temp)
{
int index1 = 0;
int index2 = 0;
int index3 = 0;
while (index1 < arr1.length && index2 < arr2.length)
{
temp[index3++] = arr1[index1] < arr2[index2] ? arr1[index1++] : arr2[index2++];
}
while (index1 < arr1.length)
temp[index3++] = arr1[index1++];
while (index2 < arr2.length)
temp[index3++] = arr2[index2++];
}