归并排序

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]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值