DS内排—2-路归并排序

DS内排—2-路归并排序

题目描述

输入一组字符串,用2-路归并排序按字典顺序进行降序排序。

输入

 测试次数t

每组测试数据:数据个数n,后跟n个字符串,字符串不含空格。

输出

 对每组测试数据,输出2-路归并排序的每一趟排序结果。每组测试数据的输出之间有1空行。

样例输入

2

6 shenzhen beijing guangzhou futian nanshan baoan

10 apple pear peach grape cherry dew fig haw lemon marc

样例输出

shenzhen beijing guangzhou futian nanshan baoan

shenzhen guangzhou futian beijing nanshan baoan

shenzhen nanshan guangzhou futian beijing baoan

 

pear apple peach grape dew cherry haw fig marc lemon

pear peach grape apple haw fig dew cherry marc lemon

pear peach haw grape fig dew cherry apple marc lemon

pear peach marc lemon haw grape fig dew cherry apple

Soulution:

import java.util.*;

public class Main{
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int t = scanner.nextInt();
		for (int i = 0; i < t; i++) {
			int n = scanner.nextInt();
			String a[] = new String[n];
			for (int j = 0; j < n; j++) {
				a[j] = scanner.next();
			}
			
			int x = 1;
			for (int j = 0; j < (int)(Math.log(n)/Math.log(2)); j++) {
				x *=2;
				for (int k = 0; k < a.length&&k+x-1<a.length ; k +=x) {
					MergeSort(a, k, k+x-1);
				}
				show(a);
			}
			MergeSort(a, 0, n-1);
			show(a);
			System.out.println();
		}
	}

	public static void Merge(String[] array, int p, int q, int r)
	{
	    int n1 = q - p + 1;
	    int n2 = r - q;

	    String[] L = new String[array.length];
	    String[] R = new String[array.length];

	    int i = 0;
	    int j = 0;

	    for(; i < n1; i++)
	        L[i] = array[i + p];
	    for(; j < n2; j++)
	        R[j] = array[j + q  +1];

	    i = j = 0;

	    int k = p;

	    while(i!=n1 && j!= n2)
	    {
	        if(L[i].charAt(0) >= R[j].charAt(0))
	            array[k++] = L[i++];
	        else
	            array[k++] = R[j++];
	    }

	    while(i < n1)
	        array[k++] = L[i++];
	    while(j < n2)
	        array[k++] = R[j++];
	    
	    
	}
	
	public static void MergeSort(String array[], int p, int q)
	{
	    if(p < q)
	    {
	        int r = (p+q)/2;
	        MergeSort(array, p, r);
	        MergeSort(array, r+1, q);
	        Merge(array,p, r, q);
	    }
	}
	
	public static void show(String [] strings) {
		for (int i = 0; i < strings.length; i++) {
			System.out.print(strings[i]);
			if (i!=strings.length-1) {
				System.out.print(" ");
			}
		}
		System.out.println();
	}
	
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜饼同学

帮助别人,就是帮助自己,共勉。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值