归并排序
思路
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)。