归并排序算法完全遵循分治模式。
操作:
分解:分解待排序的n个元素序列成各具n/2个元素的两个子序列。
解决:使用归并排序递归的排序两个子序列。
合并:合并两个已排序的子序列以产生已排序的答案。
代码如下:
package cn.bxit.ALg;
import java.util.Scanner;
public class wieghtLift {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int length=scan.nextInt();
int array[]=new int[length];
for(int i=0;i<length;i++) {
array[i]=scan.nextInt();
}
mergeSort(array,0,array.length-1);
for(int i=0;i<array.length;i++) {
System.out.print(array[i]+" ");
}
}
//归并排序
public static void mergeSort(int array[], int low, int right) {
if (low >= right) {
return;
}//当数组的头和尾相遇时,分解结束
int mid = (low + right) >>> 1;
mergeSort(array, low, mid);//分解左边
mergeSort(array, mid + 1, right);//分解右边
merge(array, low, mid, right);//开始合并
}
public static void merge(int[] array, int low, int mid, int right) {
int s1 = low;//第一个归并段的开始
int s2 = mid + 1;//第二个归并段的开始
int temp[] = new int[right - low + 1];//定义一个零食的数组来存放合并起来的数据
int k = 0;//临时数组的下标
while (s1 <= mid && s2 <= right) {
if (array[s1] <= array[s2]) {
temp[k++] = array[s1++];
} else {
temp[k++] = array[s2++];
} // 排序
}
while (s1 <= mid) {// 左边有剩余
temp[k++] = array[s1++];
}
while (s2 <= right) {// 右边有剩余
temp[k++] = array[s2++];
}
for (int i = 0; i < right - low + 1; i++) {
array[low + i] = temp[i];
} // 将临时数组的值传给array
}
}
运行结果: