• 请给出一个时间为O(nlgk)、用来将k个已排序链表的算法。此处n为所有输入链表中元素的总数。


    代码:

    #include "iostream"
    #define null 0
    using namespace std;
    
    typedef struct node{
        int data;
        struct node *next;
    }Link;
    
    int heap_size=3;
    
    Link* createLink(){
        int data;
        Link *t,*h=null,*p;
        cin>>data;
        int i=0;
        while(data!=0){
            p=(Link*)malloc(sizeof(Link));
            p->data=data;
            p->next=null;
            i++;
            if(i==1)
                h=t=p;
            else {
                t->next=p;
                t=t->next;
            }
            cin>>data;
        }
        return h;
    }
    
    int left(int i){
        return 2*i;
    }
    
    int right(int i){
        return 2*i+1;
    }
    
    void min_Heapify(Link* A[],int i){
        int l,r;
        l=left(i);
        r=right(i);
        int smallest;
        if(l<=heap_size&&A[i]->data>A[l]->data)
            smallest=l;
        else 
            smallest=i;
        if(r<=heap_size&&A[smallest]->data>A[r]->data)
            smallest=r;
        if(smallest!=i){
            Link *temp;
            temp=A[i];
            A[i]=A[smallest];
            A[smallest]=temp;
            min_Heapify(A,smallest);
        }
    }
    
    Link *extract_MinHeap(Link*A[]){
        Link* min;
        min=A[1];
        A[1]=A[1]->next;
        if(A[1]==null){
            A[1]=A[heap_size];
            heap_size--;
        }
        min_Heapify(A,1);
        return min;
    }
    
    void build_Minheap(Link*A[]){
        heap_size=3;
        for(int i=heap_size/2;i>=1;i--)
            min_Heapify(A,i);
    }
    
    Link* mergeSort(Link*A[]){
        Link *T,*n;
        T=(Link*)malloc(sizeof(Link));
        T->next=null;
        n=T;
        Link *p;
        build_Minheap(A);
        while(heap_size!=1){
            p=extract_MinHeap(A);
            p->next=null;
            n->next=p;
            n=n->next;
        }
        n->next=A[1];
        return T;
    }
    
    void display(Link *h){
        Link*p=h;
        while(p!=null){
            cout<<p->data<<" ";
            p=p->next;
        }
        cout<<endl;
    }
    
    void display1(Link *h){
        Link*p=h->next;
        while(p!=null){
            cout<<p->data<<" ";
            p=p->next;
        }
        cout<<endl;
    }
    
    void main(){
        Link* A[4];
        int i;
        for(i=1;i<4;i++)
            A[i]=createLink();
    
        for(i=1;i<4;i++)
            display(A[i]);
        Link* T=mergeSort(A);
        display1(T);
        getchar();
        getchar();
    }
    贯彻自己的思想
  • 相关阅读:
    AspNet WebApi 中应用fo-dicom抛出异常:No codec registered for tranfer syntax:
    Codeforces Round #261 (Div. 2)459A. Pashmak and Garden(数学题)
    Android开发之使用Web Service进行网络编程
    线段树 + 扫描线加深具体解释
    对Shell几个冷知识的总结(IFS,数组,替换,分割,查找)
    lscript.ld 链接器脚本
    iOS 系统地图实现及定位
    Perl怎样过滤html标签
    hdu1213 How Many Tables(并查集)
    数据结构——链表
  • 原文地址:https://www.cnblogs.com/593213556wuyubao/p/2830293.html
Copyright © 2020-2023  润新知