• 合并排序


    合并排序,将两个已经排序的数组合并成一个数组,此示例仅能合并由小到大排序的数组.

    1/合并生成一个新的数组;

    #include <iostream>
    #include <stdio.h>
    using namespace std;
    
    void mergeArray(int *a,int aLen,int *b,int bLen,int *c)
    {
        int len = aLen + bLen -1;        //指向a数组的最后一个元素
        aLen--;
        bLen--;
        while(aLen>=0&&bLen>=0)
        {
            if(a[aLen]>b[bLen])
                c[len--] = a[aLen--];
            else
                c[len--] = b[bLen--];            
        }
        while(aLen>=0)
        {
            c[len--] = a[aLen--];
        }
        while(bLen>=0)
        {
            c[len--] = b[bLen--];
        }
    }
    
    
    int main(int argc, char *argv[])
    {
    
        int a[] = {1,2,3,6,17};
        int b[] = {7,8,10,21};
        int c[9];
        mergeArray(a,5,b,4,c);
        return true;
    }

    2/其中一个数组能容下两个数组的所有元素;

    #include <iostream>
    #include <stdio.h>
    using namespace std;
    
    void mergeArray(int *a,int aLen,int *b,int bLen)
    {
        int len = aLen + bLen -1;        //指向a数组的最后一个元素
        aLen--;
        bLen--;
        while(aLen>=0&&bLen>=0)
        {
            if(a[aLen]>b[bLen])
                a[len--] = a[aLen--];
            else
                a[len--] = b[bLen--];            
        }
        while(bLen>=0)
        {
            a[len--] = b[bLen--];
        }
    }
    
    
    int main(int argc, char *argv[])
    {
    
        int a[] = {1,2,3,6,17,0,0,0,0};
        int b[] = {7,8,10,21};
        mergeArray(a,5,b,4);
    
        return true;
    }

     3.链表合并排序,将两个数序链表组合到一个链表中

    #include <iostream>
    #include <stdio.h>
    using namespace std;
    struct NodeL
    {
        int value;
        NodeL *next;
        NodeL(int value_=0,NodeL *next_=NULL):value(value_),next(next_){}  
    };
    NodeL *MergeList(NodeL *head1,NodeL *head2)
    {
        if(head1==NULL)
            return head2;
        if(head2==NULL)
            return head1;
        NodeL *head = NULL;
        if(head1->value<head2->value)
        {
            head = head1;
            head1 = head1->next;
        }
        else
        {
            head = head2;
            head1 = head2->next;
        }
        NodeL *tmpNode = head;
    
        while(head1&&head2)
        {
            if(head1->value<head2->value)
            {
                head->next = head1;
                head1 = head1->next;
            }
            else 
            {
                head->next = head2;
                head2 = head2->next;
            }
            head = head->next;
        }
        if(head1)
        {
            head->next = head1;
        }
        if(head2)
        {
            head->next = head2;
        }
        return tmpNode;
    }
    void test()
    {
        NodeL *head1 = new NodeL(1);
        NodeL *cur = head1;
        for(int i=1;i<5;i++)
        {
            NodeL *tmpNode = new NodeL(i); 
            cur->next = tmpNode;
            cur = cur->next;
        }
        NodeL *head2 = new NodeL(2);
        cur = head2;
        for(int i=11;i<35;i+=2)
        {
            NodeL *tmpNode = new NodeL(i);
            cur->next = tmpNode;
            cur = cur->next;
        }
    
        NodeL *head = MergeList(head1,head2);
        NodeL *headDelete = head;
        while(head)
        {
            cout<<head->value<<" ";
            head = head->next;
        }
        NodeL *tmp;
        while(headDelete)            //没有它是会内存泄漏的
        {
            tmp = headDelete;
            headDelete = headDelete->next;
            delete tmp;
        }
    }
    
    int main()
    {
        test();
        return 0;
    }

     检验一个数组是否是按序排列

    #include <iostream>
    using namespace std;
    int IsOrder(int num[],int lenth)
    {
        if(lenth == 1) return 1;
        int k=0;
        for(int i=0;i<lenth-1;i++)
        {
            if(num[i]<num[i+1])
            {
                if(0==k)
                {
                    k=1;
                }
                else if(-1==k)
                    return 0;
            }
            else if(num[i]>num[i+1])
            {
                if(0==k)
                {
                    k=-1;
                }
                else if(1==k)
                {
                    return 0;
                }
            }
            
        }
        if (0==k)
            {
                return 1;
            }
        return k;
        
    }
    
    int main()
    {
        int a[]={1,1,2,3,4,5,8,9};
        int b[]={1,1,2,3,4,5,8,3};
        int c[]={5,4,3,2,1,0,0};
        cout<<IsOrder(a,8)<<endl;
        cout<<IsOrder(b,8)<<endl;
        cout<<IsOrder(c,7)<<endl;
    }
  • 相关阅读:
    洛谷1509 找啊找啊找GF
    要怎样努力,才能成为很厉害的人?
    随笔
    2018NOIP模拟题 曲线
    洛谷4147 玉蟾宫
    洛谷2258 子矩阵
    Vijos 纸牌
    [leetcode] Word Break
    [leetcode] Maximum Binary Tree
    [leetcode] Binary Tree Preorder Traversal
  • 原文地址:https://www.cnblogs.com/lwngreat/p/4491210.html
Copyright © 2020-2023  润新知