zoukankan      html  css  js  c++  java
  • SCAU-8645归并排序(非递归算法)

    Description

    用函数实现归并排序(非递归算法),并输出每趟排序的结果

    输入格式

    第一行:键盘输入待排序关键的个数n
    第二行:输入n个待排序关键字,用空格分隔数据

    输出格式

    每行输出每趟排序的结果,数据之间用一个空格分隔

    归并排序思想:
    将待排序的数组拆分成单个元素,再对每个单元进行两两合并,即将两个有序的单元合并成一个有序的单元,直到整个数组有序。

    注意
    在进行合并的时候数组可能会出现越界,所以在写代码的时候记得要考虑进来。

    我的代码
    创建了一个临时数组用来在和原数组之间反复跳转合并。
    比如说原来的数组为a,将里面的元素看作单个的单元之后,就可以合并到b数组,这时候a数组里面的数据就没用了,又可以被用作合并的空间。

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <math.h>
    #include <cstdio>
    #include <string>
    typedef long long ll;
    const int MAXL=10000+10;
    
    using namespace std;
    
    int a[MAXL]= {0};
    int b[MAXL]= {0};
    int n;
    
    
    void printarr(int arr[])
    {//输出数组//
        int i;
        for(i=1; i<=n; i++)
        {
            cout<<arr[i]<<" ";
        }
        cout<<endl;
    }
    
    void mergearr(int arr[],int i,int j,int step,int brr[])//arr为原数组,brr为合并数组的空间,i和j分别是合并的两个单元的起始位置,step是合并单元的大小//
    {//合并算法//
        int last_i,last_j;
        last_i=min(i+step,n+1);
        last_j=min(j+step,n+1);
        int cnt=i;
        while(i<last_i&&j<last_j)
        {
            if(arr[i]<arr[j])
            {
                brr[cnt++]=arr[i++];
            }
            else
            {
                brr[cnt++]=arr[j++];
            }
        }
        while(i<last_i)
        {
            brr[cnt++]=arr[i++];
        }
        while(j<last_j)
        {
            brr[cnt++]=arr[j++];
        }
    }
    
    void merge_sort()
    {
        int i,j,step,k;//k用来标记是从a到b还是从b到a//
        for(step=1,k=0; step<n; step*=2,k++)
        {
            for(i=1,j=i+step; j<=n; i=j+step,j=i+step)
            {
                if(k%2==0)
                {
                    mergearr(a,i,j,step,b);
                }
                else
                {
                    mergearr(b,i,j,step,a);
                }
            }
            if(i<=n)//有时候数组会多出来单独的一块不能被两两合并,所以需要直接放到下一次合并//
            {
                if(k%2==0)
                {
                    for(i; i<=n; i++)
                    {
                        b[i]=a[i];
                    }
                }
                else
                {
                    for(i; i<=n; i++)
                    {
                        a[i]=b[i];
                    }
                }
            }
            if(k%2==0)
                printarr(b);
            else
                printarr(a);
        }
    }
    
    
    int main()
    {
        cin>>n;
        for(int i=1; i<=n; i++)
        {
            cin>>a[i];
        }
        merge_sort();
    }
    
    
  • 相关阅读:
    Django之数据库表的创建和ORM相关操作
    Django后续和Ajax初识
    阿里云Maven中央仓库配置
    java/javascript 时间操作工具类
    原生javascript实现文件异步上传
    MySQL中的存储函数和存储过程的简单示例
    java同步锁的正确使用
    浅谈javascript的面向对象思想
    java与javascript对cookie操作的工具类
    json字符串与json对象的相互转换
  • 原文地址:https://www.cnblogs.com/kstar/p/13114936.html
Copyright © 2011-2022 走看看