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

提示

#include<iostream>
#include<queue>
using namespace std;
queue<string>Q1;
queue<string>Q2;
void printstring(string *str,int n)
{
    for(int i=0;i<n;i++)
    {
        if(i!=n-1)
            cout<<str[i]<<" ";
        else
            cout<<str[i]<<endl;
    }
}
void mergeone(string *str,int low,int mid,int high)
{
    int index=low;
    while(index<=mid)
    {
        Q1.push(str[index]);
        index++;
    }
    while(index<=high)
    {
        Q2.push(str[index]);
        index++;
    }
    for(int i=low;i<=high;i++)
    {
        if(Q1.empty()&&!Q2.empty())
        {
            str[i]=Q2.front();
            Q2.pop();
        }
        else if(!Q1.empty()&&Q2.empty())
        {
            str[i]=Q1.front();
            Q1.pop();
        }
        else if(!Q1.empty()&&!Q2.empty())
        {
            if(Q1.front()>=Q2.front())
            {
                str[i]=Q1.front();
                Q1.pop();
            }
            else
            {
                str[i]=Q2.front();
                Q2.pop();
            }
        }
    }
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        string *str=new string[n];
        for(int i=0;i<n;i++)
            cin>>str[i];
        int size=1;
        int low;
        int mid;
        int high;
        while(size<n)
        {///从第一个元素开始扫描,low代表第一个分割的序列的第一个元素
            low=0;
            while(low+size<=n-1)
            {///当前的归并结束条件
                mid=low+size-1;///mid代表第一个分割的序列的最后一个元素
                high=mid+size;///high代表第二个分割的序列的最后一个元素
                if(high>=n)
                {
                    high=n-1;
                }
                mergeone(str,low,mid,high);
                low=high+1;
            }
            size*=2;
            printstring(str,n);
        }
        if(T)
            cout<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/SZU-DS-wys/p/12183128.html

时间: 2024-11-03 09:29:03

DS内排—2-路归并排序的相关文章

两路归并排序

链表两路归并 #include<iostream> #include<assert.h> using namespace std; struct node { int val; node * next; node(int v) { val=v; next=NULL; } }; node * merge(node* list1 , node * list2) { assert(list1!=NULL&&list2!=NULL);//括号中是希望出现的正确的情况  no

#23 Merge k Sorted Lists (N路归并排序)

#23 Merge k Sorted Lists (N路归并排序) 题目地址:#23 题目分类:链表/归并排序/堆排序 题目难度:hard 题目 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 翻译:合并K个已经排序的链表,返回一个排序好的链表. 思路 暴力法,我们很容易想到:以一个for循环遍历所有的链表,找出最小的,然后将这个节点加入新的链表

编程算法 - K路归并排序(k-way merge sort) 代码(C++)

K路归并排序(k-way merge sort) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy K路归并排序作为经典的外部排序算法, 是程序员必须要掌握的. 知识概念参考: <数据结构> 主要思想: 在k个已排序的文件中, 选择第一个值, 采用败者树, 更新二叉树结构, 最终选择最优值. 代码仅供参考, 如最小值用(-1)代替, 最大值用(100)代替. /* * main.cpp * * Created on: 2014年9月11日 *

2路归并排序

import java.util.Arrays; public class Merge_sort {public static void main(String[] args){ int[] nums={ 2, 7, 8, 3, 1, 6, 9, 0, 5, 4 }; sort(nums,0,nums.length-1); System.out.println(Arrays.toString(nums));} public static int[] sort(int[] num,int low,

DS内排—直插排序

题目描述 给定一组数据,使用直插排序完成数据的升序排序. --程序要求-- 若使用C++只能include一个头文件iostream:若使用C语言只能include一个头文件stdio 程序中若include多过一个头文件,不看代码,作0分处理 不允许使用第三方对象或函数实现本题的要求 输入 数据个数n,n个数据 输出 直插排序的每一趟排序结果 样例输入 7 34 23 677 2 1 453 3 样例输出 23 34 677 2 1 453 3 23 34 677 2 1 453 3 2 23

外部排序&amp;多路归并排序

外部排序: 一.定义问题 外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序 整个文件的目的.外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装入内存的部分,分别把每一部分调入内存完成排序.然后,对已经排 序的子文件进行多路归并排序. 二.处理过程 (1)按可用内存的大小,把外存上含有n个记录的文件分成若干个长度为L的子文件,把这些子文件依次读入内存,并利用有效的内部排序方法对它们进行

“《算法》第4版第2章‘排序’”:归并排序

归并排序(Merge Sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 归并操作(Merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.归并排序算法依赖归并操作.归并排序有多路归并排序.两路归并排序 , 可用于内排序,也可以用于外排序.这里仅对内排序的两路归并方法进行讨论. 归并排序的步骤如下: 1)Divide: 将待排序序列(原问题)分成两个规模大致相等的子序列(子问题

浅谈数据结构-归并排序

归并算法采用分治法,利用二叉树的概念来实现排序算法,建立在递归合并操作的基础上算法.通过将数组分组到两个序列,排序,然后在归并排序,进而实现算法.归并排序算法就是利用归并的思想实现的排序算法. 一.算法思想 数组序列{16, 7, 13, 10, 9, 15, 3, 2, 5, 8, 12, 1, 11, 4, 6, 14},利用一定的交换排序,得到有序的小序列后,进行两两合并排序后再合并,最终获得一个有序的数组.从形状上开像极了一棵倒置的完全二叉树     它的原理是假设初始序列含有n个记录,

基本排序之详解归并排序

归并排序 一.归并排序的效率是仅次于快速排序的稳定的排序算法,其时间复杂度为O(nlog2n).我们对n 个元素进行一次归并排序时,归并的次数约为log2n,每一次的两路归并排序元素的比较次数约为n-1. 二.归并排序的基本思想: 归并排序是通过将一列数组序列中的元素看成一个一个的小序列来进行归并,直到所有的元素都被归并完成后,排序即完成,便是成功的完成了排序操作. 三.原理: 如:我们对n 为9吧,这样更加好,如,a[9] = {1,2,5,4,3,8,6,7,9}这样的一个数组: 原数组: