归并排序基本思想:将待排序的序列看成n个长度为1的表,两两合并,得到长度为2的有序序列,再对这些子序列进行合并,得到长度为4的有序序列...重复上述过程,直到最后一个子序列长度为n即可。
package SortRank;
/**
* 归并排序:两两合并数组
* 分两种:递归+迭代
* @author 18322
*
*/
public class MergeSort {
public static void main(String[] args) {
int arr[] = {87,45,78,32,17,65,53,9,122,133};
MergeSort ms = new MergeSort();
System.out.println("数组排序前的顺序:");
ms.printArray(arr);
ms.sort(arr);
System.out.println("数组最终排序的顺序:");
ms.printArray(arr);
}
private void sort(int[] arr) {
sortRecursion(arr, 0 ,arr.length-1);
}
//递归方式
private void sortRecursion(int[] arr, int left, int right) {
if(left == right) return;
int middle = left + (right - left) / 2;
sortRecursion(arr, left, middle);
sortRecursion(arr, middle+1, right);
mergeArr(arr, left, middle, right);
}
private void mergeArr(int[] arr, int left, int middle, int right) {
int[] num = new int[right-left+1];
int i = left;
int j = middle + 1;
int k = 0;
while(i <= middle && j <= right) {
num[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];
}
while(i <= middle) {
num[k++] = arr[i++];
}
while(j <= right) {
num[k++] = arr[j++];
}
int index = 0;
while(left <= right) {
arr[left++] = num[index++];
}
}
private void printArray(int arr[]) {
for(int in : arr) {
System.out.print(in + "\t");
}
System.out.println();
}
//迭代方式
/*private void sort(int[] arr) {
int len = 1; //长度
while(len < arr.length) {
for(int i = 0; i < arr.length; i += 2*len) {
sortIterator(arr, i, len);
}
System.out.println("长度为" + len + "时数组的顺序:");
printArray(arr);
len *= 2;
}
}
private void sortIterator(int[] arr, int start, int len) {
int[] num = new int[len+len];
int i = start;
int j = start + len;
int k = 0;
while(i < start+len && (j < start+len+len && j < arr.length)) {
num[k++] = arr[i]<arr[j] ? arr[i++] : arr[j++];
}
while(i < start+len && i < arr.length) {
num[k++] = arr[i++];
}
while(j < start+len+len && j < arr.length) {
num[k++] = arr[j++];
}
int index = 0;
int right = start + len + len;
while(start < arr.length && start < right) {
arr[start++] = num[index++];
}
}**/
}