合并排序算法——merge
package yrz.unit2;
public class Sort {
public static int[] merge(int[] a, int p, int r, int q) {
System.out.println("传入前:");
for(int i1=0;i1<a.length;i1++){
System.out.print(" a["+i1+"]:"+a[i1]);
}
System.out.println();
int i = 0;
int j = 0;
int k = p;//point
int[] rArray = new int[r - p + 1];
int[] lArray = new int[q - r];
for (int x = 0; x < rArray.length; x++) {
rArray[x] = a[x + p];
}
for (int y = 0; y < lArray.length; y++) {
lArray[y] = a[y + r + 1];
}
while (i < lArray.length && j < rArray.length) {
if (rArray[j] > lArray[i]) {
a[k] = lArray[i];
i++;
} else {
a[k] = rArray[j];
j++;
}
k++;
}
while (i < lArray.length) {
a[k] = lArray[i];//a中被覆盖的元素重新调整到正确的位置上
i++;
k++;
}
while (j < rArray.length) {
a[k] = rArray[j];//a中被覆盖的元素重新调整到正确的位置上
j++;
k++;
}
System.out.println("处理后: ");
for(int i1=0;i1<a.length;i1++){
System.out.print(" a["+i1+"]:"+a[i1]);
}
return a;
}
public static int[] mergeSort(int[] a, int p, int q) {
if (p < q) {
int r = (p + q) / 2;
mergeSort(a, p, r);
mergeSort(a, r + 1, q);
merge(a, p, r, q);
}
return a;
}
public static int[] mergeSort(int[] a) {
mergeSort(a, 0, a.length - 1);
return a;
}
public static void main(String[] args) {
/*--------------mergeSort1()----------------*/
int[] b = { 5, 1, 7, 0, 3, 2, 8, 6};
for(int j=0;j<b.length;j++){
System.out.print(".."+mergeSort(b)[j]);
}
}
}
a作为参数输入merge方法中不断被递归传递,调整顺序,返回的a即是结果;第一次递归的结束条件是“两个”元素的排序;
即每次执行排序的是的状态如下:merge(a,0,0,1)---前两个元素排序;
merge(a,2,2,3)---第三个和第四个元素排序....一直到分成两个有序的子数组....