经典排序之归并排序
归并排序(Merge Sort)是建立在归并操作上的一种有效的排序算法,它将已有序的子序列合并,得到完全有序的序列。
归并排序的速度仅次于快速排序,时间复杂度为O(n*logn),为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。
请看下述代码:
package 排序算法.归并排序; import java.util.Arrays; /** * 归并排序 */ public class Test { static int num=0;//排序次数 //排序前,先建好一个长度等于原数组的临时数组,避免递归中频繁开辟栈空间 static void sort(int[] arr){ int[] temp=new int[arr.length]; sort(arr,0,arr.length-1,temp); } 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);//右边归并排序,使得右子序列有序 merge(arr,left,mid,right,temp);//将两个有序子数组合并操作 } } static void merge(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]; t++; i++; }else{ temp[t]=arr[j]; t++; j++; } } while (i<=mid){//将左边剩余元素填充进temp中 temp[t]=arr[i]; t++; i++; } while (j<=right){//将右序列剩余元素填充进temp中 temp[t]=arr[j]; t++; j++; } t=0; //将temp中的元素全部拷贝到原数组中 while (left<=right){ arr[left]=temp[t]; left++; t++; } System.out.println("第"+(++num)+"次:"+ Arrays.toString(arr)); } public static void main(String[] args) { int[] arr=new int[]{15,32,14,86,54,78,36}; System.out.println("排序前:"+Arrays.toString(arr)); sort(arr); System.out.println("排序后:"+Arrays.toString(arr)); } }
上述代码的运行结果为:
排序前:[15, 32, 14, 86, 54, 78, 36] 第1次:[15, 32, 14, 86, 54, 78, 36] 第2次:[15, 32, 14, 86, 54, 78, 36] 第3次:[14, 15, 32, 86, 54, 78, 36] 第4次:[14, 15, 32, 86, 54, 78, 36] 第5次:[14, 15, 32, 86, 36, 54, 78] 第6次:[14, 15, 32, 36, 54, 78, 86] 排序后:[14, 15, 32, 36, 54, 78, 86]