首页 > 其他分享 >一千题,No.0050(插入与归并)

一千题,No.0050(插入与归并)

时间:2024-06-11 18:28:39浏览次数:18  
标签:sort 归并 int ++ arr 插入 序列 排序 No.0050

根据维基百科的定义:

插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。

归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。

现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?

输入格式:

输入在第一行给出正整数 N (≤100);随后一行给出原始序列的 N 个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。

输出格式:

首先在第 1 行中输出Insertion Sort表示插入排序、或Merge Sort表示归并排序;然后在第 2 行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行首尾不得有多余空格。

输入样例 1:

10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0

输出样例 1:

Insertion Sort
1 2 3 5 7 8 9 4 6 0

输入样例 2:

10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6

输出样例 2:

Merge Sort
1 2 3 8 4 5 7 9 0 6

 解题思路:

两种排序详见:插入排序(Insertion_sort),归并排序(Merge_sort)

写了一整天,一大坨100多行终于过了

首先使insertion_sort,只要设置一个bool参数和begin位置,进行排序一次后用参数跳出并更新开始位置即可

bool temp = true;

void Insertion_sort(int *arr,int begin,int size)
{
    int i,j;
    for(i = begin;i < size && temp;++i)//第一个元素不用排序
    {
        int t = arr[i];
        for(j = i-1;j >= 0 && arr[j] > t;--j)
        {
            arr[j+1] = arr[j];//直接覆盖,速度更快(将前一个覆盖到后面)
        }
        ::temp = false;
        arr[j+1] = t;//因为是覆盖,所以要最后赋值
    }
    ::temp = true;
}

而Merge_sort就需要模拟了,因为他的常用的实现方法是用递归,不好暂停后进行下一步,所以用模拟的方法更好实现,当然也是一大坨

//模拟merge
    int num = 2;
    while(is_unsort(try2,n))
    {
        i = 0;
        while(i+num < n)
        {
            sort(try2 + i,try2 + i + num);
            i += num;
        }
        while(i < n)
        {
            sort(try2 + i,try2 + n);
            i += num;
        }
        num *= 2;

        if(is_func(try2,arrb,n))
        {
            cout << "Merge Sort\n";
            i = 0;
            while(i+num < n)
            {
                sort(try2 + i,try2 + i + num);
                i += num;
            }

            while(i < n)
            {
                sort(try2 + i,try2 + n);
                i += num;
            }
            print_arr(try2,n);
            return 0;
        }
    }

然后还需要写一个用于判断函数是否已经排好序的函数和一个判断两个数组相等的函数 

最后的代码总结如下:

#include <bits/stdc++.h>

using namespace std;

int arra[999];
int arrb[999];
bool temp = true;
bool bb = true;

void print_arr(int *arr,int size)
{
    for(int i = 0;i < size;++i)
    {
        cout << arr[i];
        if(i != size-1)
        {
            cout << " ";
        }
    }
}


bool is_unsort(int *a,int length)
{
    for(int i = 0;i < length-1;++i)
    {
        if(a[i] > a[i+1])
        {
            return true;
        }
    }
    return false;
}

bool is_func(int *a,int *b,int length)
{
    for(int i = 0;i < length;++i)
    {
        if(a[i] != b[i]) return false;
    }
    return true;
}

void Insertion_sort(int *arr,int begin,int size)
{
    int i,j;
    for(i = begin;i < size && temp;++i)//第一个元素不用排序
    {
        int t = arr[i];
        for(j = i-1;j >= 0 && arr[j] > t;--j)
        {
            arr[j+1] = arr[j];//直接覆盖,速度更快(将前一个覆盖到后面)
        }
        ::temp = false;
        arr[j+1] = t;//因为是覆盖,所以要最后赋值
    }
    ::temp = true;
}

int main()
{
    int n;
    cin >> n;
    for(int i = 0;i < n;++i)
    {
        cin >> arra[i];
    }
    for(int i = 0;i < n;++i)
    {
        cin >> arrb[i];
    }
    int try1[n],try2[n];
    for(int i = 0;i < n;++i)
    {
        try1[i] = arra[i];
    }
    for(int i = 0;i < n;++i)
    {
        try2[i] = arra[i];
    }

    //使用改进的insert排序
    int i = 1;
    while(is_unsort(try1,n))
    {
        Insertion_sort(try1,i++,n);
        if(is_func(try1,arrb,n))
        {
            cout << "Insertion Sort\n";
            Insertion_sort(try1,i++,n);
            print_arr(try1,n);
            return 0;
        }

    }

    //模拟merge
    int num = 2;
    while(is_unsort(try2,n))
    {
        i = 0;
        while(i+num < n)
        {
            sort(try2 + i,try2 + i + num);
            i += num;
        }
        while(i < n)
        {
            sort(try2 + i,try2 + n);
            i += num;
        }
        num *= 2;

        if(is_func(try2,arrb,n))
        {
            cout << "Merge Sort\n";
            i = 0;
            while(i+num < n)
            {
                sort(try2 + i,try2 + i + num);
                i += num;
            }

            while(i < n)
            {
                sort(try2 + i,try2 + n);
                i += num;
            }
            print_arr(try2,n);
            return 0;
        }
    }
}
/*
用于测试手搓的样例
9
3 1 2 8 7 5 9 4 6
1 3 2 8 5 7 4 9 6
1 2 3 8 4 5 7 9 6
*/

标签:sort,归并,int,++,arr,插入,序列,排序,No.0050
From: https://blog.csdn.net/2301_76783671/article/details/139582756

相关文章

  • 排序 - 归并排序(Merge Sort)
    将两个的有序数列合并成一个有序数列,我们称之为"归并"。归并排序(MergeSort)就是利用归并思想对数列进行排序。归并排序介绍从下往上的归并排序从上往下的归并排序归并排序实现从上往下的归并排序从下往上的归并排序归并排序的时间复杂度和稳定性归并排序时间复杂度归......
  • 归并排序(Merge_sort)
    归并排序:归并的意思是将两个数组合成为一个,而归并排序就是:将一个数组分为许多个,让多个数组按大小归并,直到归并为一个;基本思想为:将一个数组拆分为许多个两两结合的数组,然后逐步排序主要函数是将两个分开的数组排序成一个数组,需要两个指针指向两个数组开头,每次排列进去最小的......
  • sqlite3自动插入创建时间和更新时间
    最近在记录一些简单的结构化日志信息时,用到了sqlite3数据库(保存的信息比较简单,用Mysql,SQLServer,Postgres这些数据库有点小题大做)。以前开发系统时,用Mysql和Postgres比较多,sqlite3接触不多,这次使用,希望sqlite3也能提供几个基本的功能,比如:主键ID自增插入数据时,自动更新创建时间......
  • 如何在html中插入背景图片
    在头标签<head></head>里,使用<style></style>标签,可以设置图片背景颜色、透明度等opacity的范围是0-1,数值越大,背景的透明度更低即页面更清晰<head><metacharset="UTF-8"><title>用户管理</title><style>body{backgro......
  • 宝藏速成秘籍(6)归并排序法
    一、前言1.1、概念    归并排序(MergeSort)是一种基于分治思想的排序算法。它将数组分成两个子数组,分别对这两个子数组进行排序,然后再将它们合并成一个有序的数组。归并排序是一种经典的分治算法,它的核心思想是将待排序的序列逐步划分成更小的子序列,然后将这些子序列......
  • 11.4 插入排序
    目录11.4 插入排序11.4.1 算法流程11.4.2 算法特性11.4.3 插入排序的优势11.4 插入排序插入排序(insertionsort)是一种简单的排序算法,它的工作原理与手动整理一副牌的过程非常相似。具体来说,我们在未排序区间选择一个基准元素,将该元素与其左侧已排序区......
  • [Java] Mybatis向Mysql插入主副表JSON数据
    ......
  • 数据结构与算法之归并排序,以及它的代码实现与事例
    目录前言定义策略代码实现结果结束语前言今天是坚持写博客的第22天,我们来看看数据结构与算法当中的归并排序。定义首先我们来看看什么是归并排序?归并排序(MergeSort)是一种分治思想的排序算法。它将待排序的数组分成若干个子数组,每个子数组都是有序的,然后再将有序......
  • 每日一题(LeetCode · 35)搜索插入位置
    题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(logn) 的算法。示例1:输入:nums=[1,3,5,6],target=5输出:2示例 2:输入:nums=[1,3,5,6],target......
  • 8645 归并排序(非递归算法)
    Description用函数实现归并排序(非递归算法),并输出每趟排序的结果输入格式第一行:键盘输入待排序关键的个数n第二行:输入n个待排序关键字,用空格分隔数据输出格式每行输出每趟排序的结果,数据之间用一个空格分隔输入样例105480932671输出样例4508392......