归并排序:
利用分治思想,将一个数组的排序划分成两个数组的排序,再将两个化成八个,直到划分到最小单位,然后在按序合并的过程就是归并排序。
复杂度分析:
时间复杂度O(nlogn)
归并排序代码:
public static void merge(int []a,int left,int mid,int right){
int []tmp=new int[a.length];//辅助数组
int p1=left,p2=mid+1,k=left;//p1、p2是左右指针,k是存放进结果的指针
while(p1<=mid && p2<=right){
if(a[p1]<=a[p2])
tmp[k++]=a[p1++];
else
tmp[k++]=a[p2++];
}
while(p1<=mid) tmp[k++]=a[p1++];//将左半部分多出来的数组元素,直接存入数组
while(p2<=right) tmp[k++]=a[p2++];//将右半部分多出来的数组元素,直接存入数组
//复制回原数组
for (int i = left; i <=right; i++)
a[i]=tmp[i];
}
public static int[] mergeSort(int [] a,int start,int end){
if(start<end){//当子序列中只有一个元素时结束递归
int mid=(start+end)/2;//划分子序列
mergeSort(a, start, mid);//对左侧子序列进行递归排序
mergeSort(a, mid+1, end);//对右侧子序列进行递归排序
merge(a, start, mid, end);//合并
}
return a;
}