排序——归并排序(merge sort)

归并排序(merge sort):归并是将两个或者两个以上的有序表合并成一个新的有序表。归并排序使用分而治之的方法进行排序:

  1. 分解:将待排序的n个元素分解成两个子序列,每个序列包括n/2个元素。
  2. 治理:对每个子序列分别排序。
  3. 合并:将两个排序好的子序列合并,生成排序结果。

归并排序的最优时间复杂度、最差时间复杂度和平均时间复杂度均为O(nlogn)。

归并排序的空间复杂度为O(n)。

归并排序多次进行上述操作,将数组进行分解直到所有的子序列长度为1,然后依次进行合并,算法时间复杂度为O(nlogn)。实现方法如下:

public class MergeSort {

	public static void main(String[] args) {
		int[] array = {14,12,15,13,11,16};
		int[] result = sort(array, 0, array.length - 1);
		for(int i:result){
			System.out.println(i);
		}
	}

	public static int[] sort(int[] array, int low, int high) {
		
		int mid = (low + high)/2;
		if(low < high){
			//递归排序
			sort(array, low, mid);
			sort(array, mid + 1, high);
			//左右归并,将两个有序序列进行合并
			merge(array, low, mid, high);
		}
		return array;
	}

	public static void merge(int[] array, int low, int mid, int high) {
		//临时开创的新数组,用于存储合并后的有序数组
		int[] temp = new int[high - low + 1];
		
		int i = low;
		int j = mid + 1;
		int k = 0;
		
		while(i <= mid && j <= high){
			if(array[i] < array[j]){
				temp[k++] = array[i++];
			}
			else{
				temp[k++] = array[j++];
			}
		}
		while(i <= mid){
			temp[k++] = array[i++];
		}
		while(j <= high){
			temp[k++] = array[j++];
		}
		for(int x = 0; x < temp.length; x++){
			array[low + x] = temp[x];
		}
	
	}

}

猜你喜欢

转载自blog.csdn.net/jamie_byr/article/details/79853356
今日推荐