目录
归并排序(MERGE-SORT)
是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
算法思路
1.现将一个数组分成两份,依次划分,直至所有的分成每个数组都只有1
2.将数组两两合并,将合并后的数组覆盖原来的数组,依次合并,直至排序完成。
示例图
代码实现:
public void sort(int arr[], int left, int right) {
//先划分到最小
if (left < right) {
int mid = (left + right) / 2;
sort(arr, left, mid);
sort(arr, mid + 1, right);
//合并数组
mergeSort(arr, left, mid, right);
}
}
public void mergeSort(int arr[], int left, int mid, int right) {
int i = left;
int j = mid + 1;
//创建一个新的临时数组
int temp[] = new int[right - left + 1];
int t = 0;
while (i <= mid && j <= right) {
//比较两边数组的值
if (arr[i] >= arr[j]) {
temp[t++] = arr[i++];
} else {
temp[t++] = arr[j++];
}
}
//一边的数组还没遍历完,另一边的遍历完了
while (i <= mid) {
temp[t++] = arr[i++];
}
while (j <= right) {
temp[t++] = arr[j++];
}
//合并,并替换原先的数组的值
for (int k = 0; k < t; k++) {
arr[left + k] = temp[k];
}
}
算法优缺点:
时间复杂度是基于比较算法中是比较快的,时间复杂度为O(nlogn),但是需要额外的辅助空间,空间复杂度为O(n),但是对比快排以及堆排序,归并排序的算法是稳定的。