• java归并排序


    代码如下:

    public class MergeSort {
    	public static void mergeSort(DataWrap [] data)
    	{
    		sort(data , 0 , data.length-1);
    	}
    	/**
    	 * 将索引从left到right范围的数组元素进行归并排序
    	 * @param data 待排序的数组
    	 * @param left 待排数组的元素的第一个索引
    	 * @param right 待排数组的元素的最后一个索引
    	 */
    	private static void sort(DataWrap[] data, int 
    			left, int right) {
    		if(left < right)
    		{
    			//找出中间索引
    			int center = (left + right)/2;
    			//对左边数组进行递归
    		    sort(data , left , center);
    		    //对右边的数组进行递归
    		    sort(data , center+1, right);
    		    //合并
    		    merge(data , left , center , right);
    		}
    	}
    	/**
    	 * 讲两个数组进行合并,合并之前两个数组已经有序,归并后依然有序
    	 * @param data 数组对象
    	 * @param left 左数组第一个元素的索引
    	 * @param center 左数组的最后一个元素的索引 ,center+1右数组的第一个元素的索引
    	 * @param right  右数组的最后一个元素的索引
    	 */
    	private static void merge(DataWrap[] data, int left, int center, int right) {
    		DataWrap [] tmpArry = new DataWrap [data.length];
    		int mid = center +1;
    		//third记录中间数组的索引
    		int third = left;
    		int tmp = left;
    		while(left <= center && mid <=right)
    		{
    			//从两个数组中取出小的数放入中间数组
    			if(data[left].compareTo(data[mid]) <=0)
    			{
    				tmpArry[third++] = data[left++];
    			}
    			else
    			{
    				tmpArry[third++] = data[mid++];
    
    			}
    		}
    		//剩余部分依次放入中间数组
    		while(mid <= right)
    		{
    			tmpArry[third++] = data[mid++];
    		}
    		while(left <= center)
    		{
    			tmpArry[third++] = data[left++];
    		}
    		//将中间数组的内容复制拷贝到原数组
    		//(原left-right范围内的内容被复制回原数组)
    		while(tmp <= right)
    		{
    			data[tmp] = tmpArry[tmp++];
    		}
    	}
    	public static void main(String[] args) {
    		DataWrap[] data = {
    				new DataWrap(21, ""),
    				new DataWrap(30, ""),
    				new DataWrap(49, ""),
    				new DataWrap(30, ""),
    				new DataWrap(16, ""),
    				new DataWrap(9, ""),
    				new DataWrap(-16, "")
    		};
    		System.out.println("排序之前:
    " + java.util.Arrays.toString(data));
    		mergeSort(data);
    		System.out.println("排序之后:
    " + java.util.Arrays.toString(data));
    	}
    }
    

      

  • 相关阅读:
    每日一题20201109(15. 三数之和)
    每日一题20201106(169. 多数元素)
    每日一题之20201103(941. 有效的山脉数组)
    每日一题之20201102(349. 两个数组的交集)
    【USACO4.4】追查坏牛奶
    【九省联考2018】一双木棋
    【NOI2013】向量内积
    【HNOI2013】游走
    【ZJOI2008】骑士
    【HEOI2014】大工程
  • 原文地址:https://www.cnblogs.com/jialin1402/p/7397584.html
Copyright © 2020-2023  润新知