归并排序

归并排序

思路

1.归并排序采用了分而治之的策略
2.首先向将整个序列两两划分,在递归地分别对这个序列的左边和右边两两划分,这样直到最小序列为单个元素
3.之后再序列与序列之间两两归并成有序的序列,直到整个序列有序

示意图

拆分序列

合并相邻有序的子序列

转载自https://www.cnblogs.com/chengxiao/p/6194356.html

代码实现

package sort;

import java.util.Arrays;

public class MergeSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a= {10,9,8,7,6,5,4,3,2,1};
		int[] result=new int[a.length];
		System.out.println(Arrays.toString(a));
		mergeSort(a, result, 0, a.length-1);
		System.out.println(Arrays.toString(a));
		
		

	}
	
	public static void mergeSort(int[] a,int[] result,int start,int end)
	{
		if(start>=end)
		{
			return;
		}
		int len=end-start;//长度
		int mid=(len>>1)+start;//中点
		int start1=start;//前半段的起始
		int end1=mid;//前半段的终点
		int start2=mid+1;//前半段的开始
		int end2=end;//后半段的结尾
		mergeSort(a, result, start1, end1);
		mergeSort(a, result, start2, end2);
		int k=start;
		while(start1<=end1&&start2<=end2)//两个有序序列进行归并
		{
			result[k++]=a[start1]<a[start2]?a[start1++]:a[start2++];
		}
		while(start1<=end1)//剩下的放到归并结果中
		{
			result[k++]=a[start1++];
		}
		while(start2<end2)//剩下的放到结果中
		{
			result[k++]=a[start2++];
		}
		for(k=start;k<=end;k++)//把结果一一赋值给原来的数组
		{
			a[k]=result[k];
		}
	}

}

总结

  • 归并排序是稳定排序
  • 它也是一种十分高效的排序,能利用完全二叉树特性的排序一般性能都不会太差。
  • java中Arrays.sort()采用了一种名为TimSort的排序算法,就是归并排序的优化版本。
  • 从上文的图中可看出,每次合并操作的平均时间复杂度为O(n),而完全二叉树的深度为|log2n|。总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。
原文地址:https://www.cnblogs.com/mengxiaoleng/p/11716094.html