使用Java完成《算法导论》习题2.3-2

import java.util.Vector;

public class MergeSort2_3_2
{
		/**
		 * 不使用哨兵的归并排序
		 * @date 2015-6-13
		 * @author lemma
		 */

		// doSort方法
		public void doSort(Vector<Integer> Data, int start, int end)
		{

			// 递归调用doSort
			if (start < end)
			{
				int middle = (start + end) / 2;

				// 对数组前半部分进行归并排序
				doSort(Data, start, middle);

				// 对数组后半部分进行归并排序
				doSort(Data, middle + 1, end);

				// 分解数组
				Vector<Integer> SerpData1 = new Vector<Integer>();
				Vector<Integer> SerpData2 = new Vector<Integer>();
				// 从start至middle
				for (int index = start; index <= middle; index++)
					SerpData1.add(Data.get(index));
				// 从middle+1至end
				for (int index = middle + 1; index <= end; index++)
					SerpData2.add(Data.get(index));

				// 合并数组,并在原数组中排序
				for (int index1 = 0, index2 = 0, indexAll = start; indexAll <= end; indexAll++)
				{
					//第一个数组已经全部插入原数组
					if (index1 > middle - start)
					{
						Data.set(indexAll, SerpData2.get(index2));
						index2++;
					} 
					//第二个数组已经全部插入原数组
					else if (index2 > end - middle - 1)
					{
						Data.set(indexAll, SerpData1.get(index1));
						index1++;
					} 
					//第一个数组元素小于第二个数组元素
					else if (SerpData1.get(index1) <= SerpData2.get(index2))
					{
						Data.set(indexAll, SerpData1.get(index1));
						index1++;
					} 
					//第二个数组元素小于第一个数组元素
					else
					{
						Data.set(indexAll, SerpData2.get(index2));
						index2++;
					}
				}
			}
		}

		public static void main(String args[])
		{
			int OriData[] = { 15, 68, 48, 65, 12, 47, 5, 61, };
			Vector<Integer> Data = new Vector<Integer>();
			for (int index = 0; index < OriData.length; index++)
			{
				Data.add(OriData[index]);
			}
			new MergeSort2_3_2().doSort(Data, 0, Data.size() - 1);
			for (int v : Data)
			{
				System.out.print(v + "  ");
			}
		}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值