1、排序原理
把要排序的数组分成多个有序的数组,再把这些有序的数组进行排序最后得到的结果就是排序的结果。
2、实现步骤:
1)把数组中的每一个元素都看成是有序的数组,然后把这些有序的数组两两结合进行排序;
2)把第一步得到的那些有序的数组再次两两结合进行排序,不断重复这个步骤,直到只剩下一个数组;
3)此时得到的数组既是排序后的数组。
3、实现代码:
package sort;
import java.util.ArrayList;
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] a = { 50, 30, 60, 38, 54, 80, 9, 7, 423, 42, 5423, 234, 236 };
// 取出第一个排好序的数组
ArrayList<Integer> arrayList01 = new ArrayList<>();
// 取出第二个排好序的数组
ArrayList<Integer> arrayList02 = new ArrayList<>();
// 两个排好序的数组排序的结果
ArrayList<Integer> arrayList = new ArrayList<>();
int d = 1;
while (d < a.length) {
for (int i = 0; i < a.length; i++) {
if (arrayList01.size() < d) {
arrayList01.add(a[i]);
} else if (arrayList02.size() < d) {
arrayList02.add(a[i]);
}
if ((arrayList01.size() == d && arrayList02.size() == d)
|| (i == a.length - 1)) {
sort(arrayList01, arrayList02, arrayList);
/*
* 每一次要排序的两个数组排序结束后,要把集合清空,继续重新取出两个要排序的数组去排序;
*/
arrayList01.clear();
arrayList02.clear();
}
}
/*
* 把每一次排序好的结果重新赋值给原数组
*/
for (int i = 0; i < arrayList.size(); i++) {
a[i] = arrayList.get(i);
}
/*
* 每一次排序结束后,都要把这一次排序后得到的集合清空,以便下一次排序时重新赋值
*/
arrayList.clear();
System.out.println("每一次排序后d的值:" + d + " 每一次归并后的结果"
+ Arrays.toString(a));
d = d * 2;
}
System.out.println("最终的结果" + Arrays.toString(a));
}
/*
* 把两个排好序的数组进行排序的算法
*/
public static void sort(ArrayList<Integer> arrayList1,
ArrayList<Integer> arrayList2, ArrayList<Integer> arrayList3) {
int n = 0;
int m = 0;
while (n < arrayList1.size() && m < arrayList2.size()) {
while (n < arrayList1.size() && m < arrayList2.size()
&& arrayList1.get(n) < arrayList2.get(m)) {
arrayList3.add(arrayList1.get(n));
n++;
}
while (n < arrayList1.size() && m < arrayList2.size()
&& arrayList2.get(m) < arrayList1.get(n)) {
arrayList3.add(arrayList2.get(m));
m++;
}
}
while (n < arrayList1.size()) {
arrayList3.add(arrayList1.get(n));
n++;
}
while (m < arrayList2.size()) {
arrayList3.add(arrayList2.get(m));
m++;
}
}
}
排序结果:
每一次排序后d的值:1 每一次归并后的结果[30, 50, 38, 60,54,80, 7, 9, 42,423,234, 5423, 236]
每一次排序后d的值:2 每一次归并后的结果[30, 38, 50, 60, 7,9,54, 80, 42, 234,423,5423, 236]
每一次排序后d的值:4 每一次归并后的结果[7, 9, 30, 38, 50, 54, 60, 80,42, 234, 236, 423, 5423]
每一次排序后d的值:8 每一次归并后的结果[7, 9, 30, 38, 42, 50, 54, 60, 80, 234, 236, 423, 5423]
最终的结果[7, 9, 30, 38, 42, 50, 54, 60, 80, 234, 236, 423, 5423]