1.什么是归并排序
归并排序是一种基于分治思想的排序算法,它将待排序的序列分成若干个子序列,每个子序列都是有序的,然后再将这些有序的子序列合并成一个有序的序列。归并排序的时间复杂度为O(nlogn),是一种稳定的排序算法。除了排序外,归并算法还可以用于求逆序对等问题。
2.归并排序的主要思想
先拆分后合并,在合并的过程中借助临时空间进行排序。
拆分:在中间位置分成左右两部分,继续拆分,直到拆分成一个一个停止。
1.定义左指针left,右指针right和中间指针mid=(left+ringht)/2 进行拆分,直到拆分成一个一个停止。
2.合并并排序
3.代码实现
public static void main(String[] args) {
int[] arr = new int[]{2, 36, 78, 79, 76, 999, 890, 8, 3};
split(arr,0, arr.length-1);//归并排序
System.out.println(Arrays.toString(arr));
}
//归并排序
//拆分
public static void split(int[] arr,int left,int right) {
if(left==right){
return;
}
int mid=(left+right)/2;
//拆分左边
split(arr, left, mid);
//拆分右边
split(arr, mid+1, right);
merge(arr,left,mid,right);
}
//合并
public static void merge(int[] arr,int left,int mid,int right){
int s1=left;
int s2=mid+1;
int[] temp=new int[right-left+1];
int index=0;//临时数组的下标
while (s1<=mid&&s2<=right){
if(arr[s1]<arr[s2]){
temp[index]=arr[s1];
index++;
s1++;
}else {
temp[index]=arr[s2];
s2++;
index++;
}
}
//判断s1当中是否有数据,如果有将其全部放入临时数组
while (s1<=mid){
temp[index]=arr[s1];
index++;
s1++;
}
//判断s2当中是否有数据,如果有将其全部放入临时数组
while (s2<=right){
temp[index]=arr[s2];
s2++;
index++;
}
//把临时数组当中的数据放回原数组
for (int j = 0; j <temp.length ; j++) {
arr[left+j]=temp[j];
}
}