归并排序
归并排序是建立在归并操作上的一种排序算法;它是将一个序列分成子序列,再对子序列进行归并排序,最后将子序列合并得到一个有序的序列。
算法步骤:
● 把长度为n的序列分为两个长度为n/2的子序列;
● 对两个子序列分别进行归并排序;
● 合并子序列成一个有序序列。
代码实现:
package org.westos.mergesort;
import java.util.Arrays;
public class MergeSort2 {
public static void main(String[] args) {
int[] arr = new int[]{1,2,9,36,7,0,3};
mergeSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
private static void mergeSort(int[] arr, int start, int end) {
if (start < end){
int middle = (start+end)/2;
mergeSort(arr,start,middle);
mergeSort(arr,middle+1,end);
merge(arr,start,middle,end);
}
}
private static void merge(int[] arr,int low,int middle,int high){
//记录分区的下标
int i = low;
int j = middle+1;
//新数组存储子序列的元素
int[] newArr = new int[arr.length];
// 新数组的下标从low开始
int index = low;
while (i <= middle && j <= high){
//如果左边分区的元素小,先将它存入新数组
if (arr[i] < arr[j]){
newArr[index++] = arr[i++];
}else{
newArr[index++] = arr[j++];
}
}
//将分区未循环到的元素直接存入新数组
while (i <= middle){
newArr[index++] = arr[i++];
}
while (j <= high){
newArr[index++] = arr[j++];
}
//将新数组的元素遍历进原数组
for (int k = low; k <= high; k++) {
arr[k] = newArr[k];
}
}
}
执行结果: