【算法设计与分析基础】13、合并排序

package cn.xf.algorithm.ch04;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.junit.Test;

public class MergeSort {

	public void mSort(List<Integer> data) {
		if(data.size() <= 1) {
			return;
		}

		//拷贝两边的数据
		List copyA = new ArrayList();
		List copyB = new ArrayList();
		for(int i = 0; i < data.size() / 2; ++i) {
			copyA.add(data.get(i));
		}
		for(int j = data.size() / 2; j < data.size(); ++j) {
			copyB.add(data.get(j));
		}
		//递归排序子集
		mSort(copyA);
		mSort(copyB);
		//排序结束之后,放回data中
		Merge(copyA, copyB, data);
	}

	/**
	 * 合并两个子集
	 * @param dataA
	 * @param dataB
	 * @param data
	 */
	public void Merge(List<Integer> dataA, List<Integer> dataB, List data) {
		//分别遍历A,B,DATA
		int i = 0, j = 0, k = 0;

		while(i < dataA.size() && j < dataB.size()) {
			//遍历两边数据
			if(dataA.get(i) <= dataB.get(j)) {
				//吧A放进去
				data.set(k, dataA.get(i++));
			} else {
				data.set(k, dataB.get(j++));
			}
			k += 1;
		}

		if(i >= dataA.size()) {
			//如果第一个到最后了,那么把B后面的拷贝进去
			for(; j < dataB.size(); ++j) {
				data.set(k++, dataB.get(j));
			}
		} else {
			for(; i < dataA.size(); ++i) {
				data.set(k++, dataA.get(i));
			}
		}
	}

	@Test
	public void test1() {
		List<Integer> data = Arrays.asList(8,3,2,9,7,1,5,4);
		//进行排序
		MergeSort ms = new MergeSort();
		ms.mSort(data);
		for(int i : data) {
			System.out.print(i + " ");
		}
	}
}

  

结果:

时间: 2024-11-03 21:49:54

【算法设计与分析基础】13、合并排序的相关文章

算法设计与分析基础(第3版)读书笔记(及几处翻译上的错误~~)

算法设计与分析基础(第3版) p16 in-place翻译为'在位'?'就地'更合适点 p38 amortized应翻译为'均摊','摊销'这个词简直莫名其妙(可能因为翻译是做算法交易导致的?) p64 迭代优于递归(迭代始终是增量式的,而递归就没办法增量了,除非能够dump整个运行时栈) p73 通过算法可视化得到一个更好的非递归算法(人的图像认知直觉思维?) p79 验证一个拓扑是环.星.还是团?(这个地方有点意思,因为我想到了动态的Verify) p87 凸包问题:从数据结构上讲,Set<

【算法设计与分析基础】大整数乘法

#include<iostream> #include<string> #include<time.h> #include<stdlib.h> #include<sstream> using namespace std; class BigDecimal{ private: int max(int a,int b){//获取两数中的最大值 return a^((a^b) & -(a<b)); } public: string n;

【算法设计与分析基础】5、冒泡排序与选择排序

package cn.xf.algorithm.ch03; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * 数据排序 * * @author xiaof * */ public class Sort { /** * 对给定的数组进行排序 选择排序法 每次选择在当前序列之后的最小值,和当前序列数据进行对换 * * @param inputData * @return */ publi

【算法设计与分析基础】关灯游戏

① R.java  用于存储一些全局变量 package lightoff; public class R { /* public static int lightCondition[][] = { {1,0,0,1,1}, {1,0,0,1,1}, {1,0,0,1,1}, {1,0,0,1,1}, }; */ public static int lightCondition[][] = { {1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1}, }; //灯面

【算法设计与分析基础】18、霍纳法则

产生随机数 package cn.xf.algorithm.ch02; import java.util.ArrayList; import java.util.List; /** * 生产随机数 * @author xiaof * */ public class Random { /** * 生产一个随机数的数列 * @param n 生成n个数列 * @param m 数据在0和m-1之间 * @param seed 随机初始种子 * @param a 参数 * @param b 参数 *

算法设计与分析 5.1 合并果子

★题目描述 GYY面前有N堆果子,分别有1,2,3,....,N个果子,这N堆果子一开始按照某种顺序排列. GYY有一种独特的魔法,他每轮操作会依次把第i+1堆的果子复制一份加到第i堆上,最后舍弃掉最后一堆. N轮操作之后,就只剩下一堆果子了(废话). 然而当GYY忙活完这一切的时候,他发现他忘了自己一开始的N堆果子是怎么摆放的了, 现在给你操作轮次数和最后那堆果子的数量,找到一个满足条件的初始排列 如果有多个解则输出字典序最小的那一个. ★输入格式 输入仅一行,包括两个正整数N和Sum,表示一

【算法设计与分析基础】23、堆排序-2

package cn.xf.algorithm.ch09Greedy.util; import java.util.ArrayList; import java.util.List; /** * 堆构造以及排序 * * .功能:堆的构造 * 1.堆可以定义为一颗二叉树,树的节点包含键,并且满足一下条件 * 1) 树的形状要求:这棵二叉树是基本完备的(完全二叉树),树的每一层都是满的,除了最后一层最右边的元素可能缺位 * 2) 父母优势,堆特性,每一个节点的键都要大于或者等于他子女的键(对于任何叶

【算法设计与分析基础】19、字符串匹配算法

package cn.xf.algorithm.ch07inputEnhancement; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; /** * * 功能:字符串匹配算法,(还有一种叫KMP算法的,也是很经典的算法,就是比较复杂) * * 第一步:对于给定的长度为m的模式和在模式文本中用到的字母表,按照上面的描述构造移动表 * 第二步:将模式与文本的开

【算法设计与分析基础】16、高斯消元法

package cn.xf.algorithm.ch06ChangeRule; import java.util.ArrayList; import java.util.List; import org.junit.Test; import cn.xf.util.GenericPair; /** * * 功能:高斯消元法,也就是多元数据矩阵,依次吧每列的其他行数据消去为0,然后求出一个元的解,然后就可以根据这个数据来递推出其他元的解 * @author xiaofeng * @date 2017