归并排序是一种分治算法,它将一个数组分成两个子数组,然后递归地对子数组进行排序,最后将两个有序的子数组合并成一个有序的数组。
具体步骤如下:
- 将数组不断地拆分成两个子数组,直到每个子数组只有一个元素。
- 对每个子数组进行合并排序,即将两个有序的子数组合并成一个有序的数组。
- 重复步骤2,直到所有子数组都合并成一个有序的数组。
合并排序的关键在于合并操作。合并操作的步骤如下:
- 创建一个临时数组,用于存放合并后的有序数组。
- 使用三个指针,分别指向左子数组、右子数组和临时数组的位置。
- 比较左子数组和右子数组的元素,将较小的元素放入临时数组,并将对应指针向后移动一位。
- 重复步骤3,直到左子数组或右子数组的元素全部放入临时数组。
- 将剩余的元素依次放入临时数组。
- 将临时数组的元素复制回原数组的对应位置。
归并排序的时间复杂度是O(nlogn),其中n是数组的长度。它是一种稳定的排序算法,适用于各种数据类型的排序。
需要注意的是,在实际应用中,归并排序的空间复杂度较高,需要额外的空间来存储临时数组。如果对空间复杂度有要求,可以考虑使用其他排序算法。
代码实现:
java
package com.lut.sort;
public class MergeSort {
public static 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);
merge(arr,left,right,mid);
}
}
private static void merge(int[] arr, int left, int right, int mid) {
int[] temp = new int[right-left+1];
int i = left;
int j = mid + 1;
int k = 0;
while(i <= mid && j <= right){
if(arr[i] < arr[j]){
temp[k++] = arr[i++];
}else{
temp[k++] = arr[j++];
}
}
while (i <= mid){
temp[k++] = arr[i++];
}
while (j <= right){
temp[k++] = arr[j++];
}
for (int count = 0; count < temp.length; count++) {
arr[left+count] = temp[count];
}
}
public static void main(String[] args) {
int[] arr = {3,4,1,8,0,7,1,6};
sort(arr, 0, arr.length - 1);
for (int i : arr) {
System.out.print(i + " ");
}
}
}