合并排序

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

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;

}

 

你可能感兴趣的:(排序)