归并排序是一种高效、通用、基于比较的排序算法。此外,归并排序还是稳定的,因为相同元素的相对次序在排序后不会发生变化。
时间复杂度:O(nlgn)
思路:将一个数组先分成两份,再分成四分,依次向下推,将每个部分分别排序,将排好序的各个部分再进行合并,得到排好序的数组
代码思路:将数组分为左右两个数组,递归调用并进行排序分别排序完成后,使用辅助的合并函数将两个有序的子数组合并成一个整体有序的数组
代码:
package 练习;
import java.util.*;
public class App {
public static void sort(int[] arr) {
int[] temp = new int [arr.length];//排序前,建类一个长的等于原数组长度的临时数组,作
sort(arr,0,arr.length-1,temp);
}
private static void sort(int[] arr,int left,int right,int[] temp) {
if(left<right){
int mid = (left+right)/2;//找出分割点
sort(arr,left,mid,temp);//左排序
sort(arr,mid+1,right,temp);//右排序
marge(arr,left,mid,right,temp);//合并
}
}
private static void marge(int[] arr,int left,int mid,int right,int[] temp) {
int i=left;//左指针
int j=mid+1;//右指针
int t=0;//临时数组指针
while(i<=mid&&j<=right) {//根据指针从两个区间由大到小取值:小的先过
if(arr[i]<=arr[j]) {
temp[t++]=arr[i++];
}else {
temp[t++]=arr[j++];
}
}
while(i<=mid) {//右边取完,直接将左边的房里面去
temp[t++]=arr[i++];
}
while(j<=right) {//左边取完,将右边的填入
temp[t++]=arr[j++];
}
t=0;//将t复原,保证下次正常使用
while(left<=right) {//将temp中的数据传入arr中保证temp的再次使用
arr[left++]=temp[t++];
}
}
public static void main(String[] args) {
int arr[]= {23,45,675,23,76,23,8,34};
sort(arr);
System.out.println(Arrays.toString(arr));
}
}
感受:感觉这个排序的思路比较简单,但是它的代码相对来说比较复杂,有点难理解