之前几种排序对数组小的效果比较好一点,现在来一个相对复杂点的。归并排序的原理:从字面上解释归并就是合并的意思,要合并起码的条件就是有两个数组。思路就可以从要排序的数组中找到中间值分为前后两个部分进行分别排序然后在合并,基本思路确定就可以考虑下如何实现了。
public static void mergeSort(int[] arr, int fromIndex, int toIndex){
if(fromIndex < toIndex){
// 找出中间值
int mid = (fromIndex + toIndex) >>> 1;
// 前半部分
mergeSort(arr, fromIndex, mid);
// 后半部分
mergeSort(arr, mid + 1, toIndex);
// 归并
merge(arr, fromIndex, mid, toIndex);
}
}
// 归并方法
private static void merge(int[] arr, int left, int center, int right){
int[] relArr = new int[arr.length];
int low = left;
int temp = left;
int high = center + 1;
// 同事循环2个部分
while(left <= center && high <= right){
if(arr[left] < arr[high]){
relArr[low++] = arr[left++];
}else{
relArr[low++] = arr[high++];
}
}
// 如果前半部分没有合并完继续循环
while(left <= center){
relArr[low++] = arr[left++];
}
// 如果后半部分没有合并完也继续循环
while(high <= right){
relArr[low++] = arr[high++];
}
// 把中间值再放回去
while(temp <= right){
arr[temp] = relArr[temp++];
}
System.out.println(Arrays.toString(arr));
}
算法没有好坏之分要和实际要操作的数组大小和存储的值有关