归并排序的java实现
简介
`归并排序是一种稳定的排序算法,采用分治、合并的思想,算法的时间复杂度是O(nlogn)。引用百度百科解释:“将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序”。
实现代码
分为digui函数和merge函数,digui函数中将数组分为两块分别递归,merge函数将有序的小数组进行合并,层层向上合并,结合这两个函数,归并排序后的数组有序。
// 递归分解成两部分,再通过merge
public static void digui(int[] nums,int i,int j){
if(i==j){
return;
}
int mid = i+((j-i)>>1);
digui(nums,i,mid);
digui(nums,mid+1,j);
merge(nums,i,mid,j);
}
// 合并
public static void merge(int[] nums,int i,int mid,int j){
int[] helper=new int[j-i+1];
int p1 = i;
int p2 = mid+1;
int k = 0;
while(p1<=mid&&p2<=j){
helper[k++]=nums[p1]<nums[p2]?nums[p1++]:nums[p2++];
}
while(p1<=mid){
helper[k++]=nums[p1++];
}
while(p2<=j){
helper[k++]=nums[p2++];
}
// 把辅助数组的值赋值给nums
for(int s=0,m=i;s<j-i+1;s++){
nums[m++]=helper[s];
}
}`
测试结果
在使用的时候调用digui(nums,0,nums.length-1)方法,数组就按照从小到大的顺序排好。
public static void main(String[] args) {
int[] nums = {2,3,1,5,4,1};
digui(nums,0,nums.length-1);
for(int i:nums){
System.out.println(i);
}
}
``